2014-01-15 151 views
1

當調用腳本進而運行後臺進程時,使用subprocess.call時出現問題。python:調用運行後臺進程的腳本的子進程掛起

我從python腳本調用bash腳本。 python 2.7.3。

#!/bin/python 
from subprocess import call 
. 
. 
call(["run_exp",file_name]) 
print "exp complete!" 
. 
. 

run_exp是在後臺運行的過程的bash腳本。

#!/bin/bash 
. 
. 
run_task auto_output 2>/dev/null & 
. 
. 
echo "run_exp finished!" 

run task命令是另一個bash腳本。這總是在run_exp完成時完成。

從命令行運行run_exp我看到預期行爲並且所有進程都已完成。

當我使用python call調用run_exp命令時出現問題。當使用call時,我看到輸出「run_exp finished!」但從不「完成!」。如果我從run_exp中刪除run_task操作(及其相關代碼及其在run_exp中的操作),則call命令將按預期運行完成。這導致我相信當調用的腳本在後臺運行進程時,使用call會出現問題。

任何人都可以闡明爲什麼會發生這種情況。 謝謝!

回答

0

後臺腳本的輸出仍然與子腳本使用相同的文件描述符。這就是爲什麼父母腳本仍然在等待它完成。

,如果你想醜化他們,您應該關閉在後臺腳本中的所有文件描述:(括號爲此在子shell,我有時會發現需要)

(run_task auto_output >/dev/null 2>&1) & 

而且它可以幫助wait明確你的孩子腳本結束的後臺進程:

run_task auto_output 2>/dev/null & backgroundPid=$! 
... 
echo "run_exp finished!" 
wait "$backgroundPid" 

也許結合兩種策略如果雙方都失敗,也應該嘗試。

+1

這似乎工作謝謝。我用選項1.我不知道我是否仍然打開文件描述符,並且即時忽略此問題。任何雖然? – user3198562

+0

如果有效,爲什麼呢? ;-) – Alfe