我有一个名为' 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是不可能的?
答案 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'])