Skip to main content
 首页 » 编程设计

python:调用运行后台进程挂起的脚本的子进程

2025年05月04日7mfryf

我在调用运行后台进程的脚本时使用 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 call 调用 run_exp 命令时出现问题。使用 call 时,我看到输出“run_exp finished!”但永远不会“exp complete!”。如果我从 run_exp 中删除 run_task 操作(以及与其在 run_exp 中的操作相关联的代码),则 call 命令按预期运行完成。这让我相信当调用的脚本在后台运行进程时,使用 call 会出现问题。

任何人都可以阐明为什么会发生这种情况。 谢谢!

请您参考如下方法:

后台脚本的输出仍然与子脚本相同的文件描述符。这就是父脚本仍在等待它完成的原因。

如果你想妖魔化它们,你应该关闭后台脚本中的所有文件描述符:

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

(括号在我有时发现需要的子 shell 中执行此操作。)

此外,在后台进程的子脚本末尾显式等待也有帮助:

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

如果两者单独失败,也许还应该尝试结合这两种策略。