【问题标题】:Python subprocess Popen hangs before processing all commandsPython子进程Popen在处理所有命令之前挂起
【发布时间】:2017-11-30 14:48:37
【问题描述】:

这是我在 Jupyter Notebook %%bash 魔法单元中的最初问题/观察结果,该单元也在 IPython 控制台中重现。我打算从笔记本页面启动几个 MPI 程序。在这里,我使用date系统命令作为一个简单的复制器。

In [1]: %%bash
   ...: echo "First"
   ...: mpirun -np 2 date
   ...: echo "Second"
   ...: mpirun -np 2 date
   ...: echo "End"
   ...: 
First
mar. juin 27 15:17:36 CEST 2017
mar. juin 27 15:17:36 CEST 2017

只执行第一个mpirun 命令,之后的所有命令都不会执行。此行为直接用subprocess.Popen 重现,请参见下面的示例代码:

from subprocess import *
from IPython.utils import py3compat
def test(s):
    p = Popen(['bash'], stdout=PIPE, stderr=PIPE, stdin=PIPE)
    out, err = p.communicate(s.encode('utf8', 'replace'))
    print(py3compat.bytes_to_str(out))
test("""echo "First"
mpirun -np 2 date
echo "Second"
mpirun -np 2 date
echo "End" """)

我可能遗漏了一些东西,但Popen 似乎在第一个mpirun 之后停止执行每个命令。当所有内容都放在一行上时,我得到了预期的结果,但对于 IPython 魔术单元来说,这并不是很有趣:

test("""echo "First"; mpirun -np 2 date; echo "Second";mpirun -np 2 date; echo "End" """)

关于Popen 挂起的原因有什么想法吗? 感谢您的反馈。

(在 Linux 上测试,使用 Python-2.7.13 和 IPython-5.4.1,还使用 ​​Python 3.6.1 和 IPython 6.1.0,并使用多个版本的 OpenMPI-1.10.x 和 2.1.x)

【问题讨论】:

  • 我正在使用 Python 3.6.1 和 iPython 6.1.0,我没有这个问题。 [1]:i.stack.imgur.com/78dut.png 我正在使用 Python 3.6.1 和 iPython 6.1.0,我没有这个问题。在此处输入图像描述我看到您更改了 Python 版本和 iPython 版本。您的 bash 中可能有一些设置导致了这种行为。

标签: python ipython mpi jupyter-notebook


【解决方案1】:

除了 shell 之外,你还需要 bash 吗?您可以使用 shell=True Popen 选项并将您的命令字符串直接传递给 Popen 吗?对我来说就是这样:

commands = """mpirun -np 2 date
mpirun -np 2 date
mpirun -np 2 date"""
p = Popen(commands, stdout=PIPE, stderr=PIPE, stdin=PIPE, shell=True)
p.stdout.read()
'Thu Jun 29 00:41:16 UTC 2017\nThu Jun 29 00:41:16 UTC 2017\nThu Jun 29 00:41:16 UTC 2017\nThu Jun 29 00:41:16 UTC 2017\nThu Jun 29 00:41:16 UTC 2017\nThu Jun 29 00:41:16 UTC 2017\n'

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2012-09-05
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多