python:proc.comunicate挂起

时间:2018-02-24 10:54:22

标签: python subprocess

我试图在python中启动另一个脚本然后给出输入答案,这是主脚本:

import subprocess
import sys
import platform

cmdline = ['py', 'ciao.py']
cmd = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
for line in cmd.stdout:
    if line == b'Loading...\r\n':
        print("sending data...")
        cmd.communicate(b"test\n")[0]
        print("done")
    print(line)
print(line)

这是 ciao.py

import os
import re
import time
print("Loading...")
ciao = input("> ")
print(ciao)
os.system("mkdir okfunziona")
print("Done")
while 1:
    time.sleep(10)

主脚本设法发送"test",但随后挂起并且不会将"done"打印到控制台。

问题出现在Windows和Linux上。

-------------------------------------------- - - - - - - - - - -编辑 - - - - - - - - - - - - - - - -------------------------------- 好的,我已经测试了Ashish Nitin Patil的示例,但我看到b'Loading...\r\n'输出,我看不到辅助脚本的其他输出,如">""Done",似乎"cmd.stdout.readline ()"仅在第一次起作用,因为脚本没有结束。

1 个答案:

答案 0 :(得分:2)

请参阅this answer (and others on that question)获取灵感。对于您的情况,您应该使用communicate,而是使用stdin.writestdout.readline

您的主要脚本可能如下所示 -

while True:
    line = cmd.stdout.readline()
    print(line)
    if line.strip() == b'Loading...':
        print("sending data...")
        cmd.stdin.write(b"test\n")
        cmd.stdin.close()
        print("done")
    elif line.strip() == b'Done':
        break

输出 -

b'Loading...\n'
sending data...
5
done
b'> test\n'
b'Done\n'