2009-01-16 43 views
145

可能重複:
Calling an external command in Python從執行Python中的命令行程序

我建設,這將是要操縱一個Web應用程序(墊,混合,合併等)的聲音文件,我發現sox正是我想要的。 Sox是一個linux命令行程序,我感到有點不舒服,因爲python web應用程序在每個請求的基礎上在我的服務器上啓動新的sox進程。

例子:

import os 
os.system('sox input.wav -b 24 output.aiff rate -v -L -b 90 48k') 

這整個安裝在我看來有點不穩定。

所以我的問題是,從python(或任何腳本語言)web應用程序中運行命令行程序的最佳做法是什麼?

爲了解決整個請求響應週期,實現消息隊列是一件事情。但是還有其他方法可以讓這些東西更加優雅嗎?

+2

相關:http://stackoverflow.com/questions/89228/how-to-call-external-command-in-python,http://stackoverflow.com/questions/311601/python-as-a-batch -script-ie-run-commands-from-python – 2009-01-16 12:55:16

+0

@ S.Lott並不完全,因爲它更具體到Web服務器/ Web應用程序上下文。 – ThomasH 2011-05-11 16:48:42

+1

@Thomas。在這種情況下,我看不出「網絡」如何改變任何東西。你能解釋爲什麼「網絡」在運行子過程時很重要嗎? – 2011-05-11 17:00:19

回答

142

subprocess模塊是從Python運行其他程序的首選方式 - 比os.system更靈活和更好用。

import subprocess 
#subprocess.check_output(['ls','-l']) #all that is technically needed... 
print subprocess.check_output(['ls','-l']) 
2

我對sox並不熟悉,但是可以將它設置爲服務並連接到請求,而不是重複調用程序作爲命令行?您可以查看連接界面,例如sqlite以獲取靈感。

18

「這整個設置對我來說似乎有點不穩定。」

ffmpegx人討論關於通過命令行後端創建GUI前端的問題。它似乎沒有打擾他們。

事實上,我認爲通過命令行後端的GUI(或web)前端實際上更穩定,因爲GUI和命令之間有非常非常乾淨的界面。只要命令行選項兼容,命令就可以以不同於網絡的速度演變,您不可能發生破壞。

4

我感覺有點不舒服 具有一個基於每個請求我 服務器上啓動新的SOX過程Python的Web應用程序 。

對我來說,這似乎意味着,他擔心的是,如果他打開了自己的Web服務器向公衆開放,有不是很多,他可以做,以防止自己的服務器資源被消耗掉,如果15.000人民決定點擊以這種方式啓動sox的按鈕。

3

如果您擔心服務器性能,那麼請考慮限制正在運行的sox進程的數量。如果上限已被擊中,您可以隨時緩存請求,並在用戶完成任何適合您的應用程序的情況下通知用戶。

或者,在其他機器上有n個工作腳本,它們從db中調用請求並調用sox,然後將生成的輸出文件推送到需要的位置。