2014-10-13 70 views
0

我在這裏遇到一些問題,試圖使用subprocess.Popen。我不能使用subprocess.Call來編寫我正在編寫的腳本,因爲我希望能夠爲我的執行指定環境,而我只能通過方法的參數在Popen中這樣做。我注意到subprocess.Popen需要更長的時間來完成該子進程。調用,並且這在我的腳本中產生了下游問題,因爲我的腳本的其餘部分依賴於產生的進程的退出代碼(返回代碼)來決定(通過一組有條件的If語句)進行適當的操作。如何確保腳本僅在子進程完成後執行後續方法

涉及使用子過程的方法是:

def execute_local(self): 
''' 
Spawns a test execution process locally and directs the standard output and 
error streams from the process to the appropriate log files. 
''' 
self.return_code = subprocess.Popen(args = self.cmd_string, 
            stdout = open(self.out_log_filepath, 'w'), 
            stderr = open(self.err_log_filepath, 'w'), 
            shell = True) 

我還沒有指定的ENV參數還沒有,因爲我需要確保這個工程之前,我可以繼續前進。

和包含該條件語句後續方法是:

def get_status(self): 
''' 
Returns a string named either passed or failed back to itself, depending on 
exit status of the process that was spawned in the execute_local method. 

This is important for main.py to be able to examine the status of the test 
processes and take appropriate administrative actions to either continue to 
a new test step or retry a give test. 
''' 
print self.return_code 
if self.return_code == 0: 
    return 'passed' 
else: 
    return 'failed' 

在更高層次的模塊,所述方法將被稱爲按照以下順序:execute_local ---接着----> GET_STATUS。

此前,當我通過調用完成此操作時,執行過程順利進行到條件,但現在與Popen不同。當我嘗試使用print語句打印出由子進程產生的進程的返回代碼時(我在get_status方法中添加了print self.return_code語句,如下所示),我發現通過調用,我實際看到返回代碼,但與Popen,我得到的是對象本身和它的內存地址。

我非常感謝這方面的幫助,如果有人能向我解釋爲什麼Popen比打電話要花更多時間才能跑步。

非常感謝!

回答

1

subprocess.call只是一個圍繞Popen的包裝,它等待被調用的進程退出。它採用與Popen相同的參數,可以替換(錯誤執行)Popen,並用call替換它以獲得所需內容。

self.return_code = subprocess.call(args = self.cmd_string, 
            stdout = open(self.out_log_filepath, 'w'), 
            stderr = open(self.err_log_filepath, 'w'), 
            shell = True, 
            env=my_env) 

在您當前的實現中,您返回的是Popen對象,而不是返回碼。

+0

非常感謝您的回答!這澄清。我認爲他們應該在Pydocs中加入env參數(以及所有其他參數),否則它會使得看起來好像call缺少Popen所具有的某些功能。 – AKKO

相關問題