为什么从stdout读取时子进程会挂起

时间:2016-05-16 03:51:37

标签: python subprocess

我有一个名为' my_script.py'具有以下内容:

my_input = ''
while my_input != 'quit':
    my_input = raw_input()
    print(my_input)

然后在控制台中,输入以下命令:

from subprocess import *
p1 = Popen(['python', 'my_script.py'], stdin=PIPE)
p1.stdin.write('some words\n')

打印"一些单词",但如果我写了

from subprocess import *
p2 = Popen(['python', 'my_script.py'], stdin=PIPE, stdout=PIPE)
p2.stdin.write('some words\n')
p2.stdout.readline()

shell将挂起,我必须手动终止它。如果我想能够访问脚本的stdout,我怎么能让它工作?我使用的是python2.7

编辑:为了澄清我的问题,上面的代码片段将适用于其他具有I / O循环的可执行文件(我正在使用的特定代码是Stockfish国际象棋引擎)。有没有办法可以修改my_script.py,以便上面的代码段可以正常运行?使用

Popen(['python3', 'my_script.py'], ...)

会起作用,但是使用Python 2.7是不可能的?

1 个答案:

答案 0 :(得分:0)

可能由于readline中的死锁而发生。

您需要使用communicate方法异步读取。

示例:

 def run_shell_command(cmd, params):
        cmdline = [cmd]
        p = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        stdout, stderr = p.communicate()
        if p.returncode != 0:
            raise RuntimeError("%r failed, status code %s stdout %r stderr %r" % (
                cmd, p.returncode, stdout, stderr))
        return stdout.strip()  # This is the stdout from the shell command

要在后台执行命令,您可以使用以下示例:

def run_shell_remote_command_background(cmd):
    cmdline = [cmd]
    cmdline = cmdline + params.split(' ')
    subprocess.Popen(['cmdline'])