2014-02-14 33 views
1

當使用Python的sh模塊(未STDLIB的一部分),我可以在我的道路調用程序的功能,並在後臺運行它:Python的SH模塊 - 在後臺運行命令封套

from sh import sleep 

# doesn't block 
p = sleep(3, _bg=True) 
print("prints immediately!") 
p.wait() 
print("...and 3 seconds later") 

我可以使用SH的Command包裝和可執行文件的絕對路徑傳遞(有益的,如果可執行文件是不是在我的路徑或具有字符,如.):

import sh 
run = sh.Command("/home/amoffat/run.sh") 
run() 

但試圖運行包可執行文件中背景,作爲foll OWS:

import sh 
run = sh.Command("/home/amoffat/run.sh", _bg=True) 
run() 

有回溯錯誤失敗:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: __init__() got an unexpected keyword argument '_bg' 

如何運行通過sh.Command在後臺包裹可執行?尋找一個優雅的解決方案。

編輯:

我用Python解釋用於測試傳遞_bg到命令(未包裝),我現在知道的是一個壞的方式來測試用於阻塞和非阻塞的過程:

>>> import sh 
>>> hello = sh.Command("./hello.py") 
>>> hello(_bg=True) # 5 second delay before the following prints and prompt is returned 
HI 
HI 
HI 
HI 
HI 

隨着hello.py爲如下:

#!/usr/bin/python 

import time 

for i in xrange(5): 
    time.sleep(1) 
    print "HI" 
+0

你可以使用POPEN /子。 – Claris

回答

4
import sh 
run = sh.Command("/home/amoffat/run.sh", _bg=True) # this isn't your command, 
                # so _bg does not apply 
run() 

代替,做

import sh 
run = sh.Command("/home/amoffat/run.sh") 
run(_bg=True) 

(順便說一句,在subprocess模塊提供一個更神奇的方式做這樣的事情。)

+0

看起來'_bg'不適用於該命令。這是我在嘗試將'_bg'傳遞給'sh.Command'包裝器之前所嘗試的。我應該提到這一點。 – billyw

+1

@billyw,發佈一個完整的,可運行的文件,以及您完成此追溯的情況。 –

+0

您的解決方案不會引起追溯,而是過程仍然阻塞。事實證明,我需要將運行命令分配給一個變量,即'p = run(_bg = True)'。單獨運行'run(_bg = True)'會導致進程阻塞。但是,您解決了我最初發布的問題,因此我將接受此問題作爲正確答案。 – billyw