【问题标题】:python: subprocess calling a script which runs a background process hangingpython:子进程调用运行后台进程挂起的脚本
【发布时间】:2014-01-15 15:23:21
【问题描述】:

我在调用脚本时使用 subprocess.call 时遇到问题,而脚本又会运行后台进程。

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

谁能解释为什么会发生这种情况。 谢谢!

【问题讨论】:

    标签: python subprocess background-process


    【解决方案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"
    

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

    【讨论】:

    • 这似乎有效,谢谢。我使用了选项 1。我不确定我是否仍然打开文件描述符并且我忽略了这个问题。有什么想法吗?
    猜你喜欢
    • 2015-08-19
    • 2012-06-04
    • 2016-11-02
    • 2021-12-26
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多