我在调用脚本时使用subprocess.call时出现问题,脚本又会运行后台进程。
我从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 run_exp
调用call
命令时出现问题。使用call
时,我看到输出“run_exp finished!”但从来没有“完成!”。如果我从run_task
中删除run_exp
操作(及其run_exp
中的操作的关联代码),call
命令将按预期运行完成。这使我相信当调用的脚本在后台运行进程时使用call
会出现问题。
任何人都可以解释为什么会发生这种情况。 谢谢!
答案 0 :(得分:1)
后台脚本的输出仍然与子脚本的文件描述符相同。这就是父脚本仍在等待它完成的原因。
如果你想将它们妖魔化,你应该关闭后台脚本中的所有文件描述符:
(run_task auto_output >/dev/null 2>&1) &
(括号在子shell中执行此操作,我有时会发现它是必需的。)
此外,在您的子脚本末尾显式wait
可以帮助后台进程:
run_task auto_output 2>/dev/null & backgroundPid=$!
...
echo "run_exp finished!"
wait "$backgroundPid"
如果两种策略都单独失败,也可以尝试将这两种策略结合起来。