Python subprocess.Popen不工作

时间:2015-06-24 21:48:16

标签: python subprocess popen

我一直在阅读很多文件,但我仍然不确定我做错了什么。

所以我有一个单独的shell脚本,它会启动一个单独的服务器,然后是我正在处理的服务器。连接服务器后,我想运行ls,就是这样。但是,由于某种原因,stdin = subprocess.PIPE阻止Popen命令终止,以便下一行可以执行。例如,因为代码卡住了我将按Ctrl + C但是我会收到一条错误消息,说wait()有一个键盘中断。这是一个示例代码:

import subprocess
from time import sleep

p1 = subprocess.Popen("run_server", 
                      stdout = subprocess.PIPE, 
                      stdin = subprocess.PIPE)
#sleep(1)
p1.wait()
p1.communicate(input = "ls")[0]"

如果我用p1.wait()替换sleep(1)communicate命令会运行并显示ls,但运行服务器的脚本会在tty上检测到eof并自行终止。我必须在Popen之间进行某种等待并进行通信,因为服务器脚本将因同样的原因而终止。

2 个答案:

答案 0 :(得分:1)

在子进程死亡之前,

p.wait()不会返回。虽然父脚本卡在p.wait()电话上;你的子进程同时期望输入 - 死锁。然后在shell中按Ctrl+C;它将SIGINT信号发送到前台进程组中的所有进程,这些进程将终止您的父Python脚本和run_server子进程。

您应该放弃.wait()来电:

#!/usr/bin/env python
from subprocess import Popen, PIPE

p = Popen(["run_server"], stdout=PIPE, stdin=PIPE)
output = p.communicate(b"ls")[0]

或者在Python 3.4 +中:

#!/usr/bin/env python3
from subprocess import check_output

output = check_output(["run_server"], input=b"ls")

如果要运行多个命令,请立即传递所有命令:

input = "\n".join(["ls", "cmd2", "etc"]) # with universal_newlines=True

正如您在阅读subprocess文档时所知,p.communicate()等待子进程退出,因此最多应调用一次。与.wait()一样,.communicate()返回后,子进程已经死亡。

答案 1 :(得分:0)

当您按Ctrl + C并且回溯表示您陷入wait()意味着下一行正在执行时,下一行是wait()。在您的p1进程返回之前,wait()不会返回。但是,在您发送命令之前,似乎您的p1进程不会返回,在您的情况下为'ls'。尝试发送命令,然后调用wait()。:

import subprocess
from time import sleep

p1 = subprocess.Popen("run_server", 
                      stdout = subprocess.PIPE, 
                      stdin = subprocess.PIPE)
#sleep(1)
p1.communicate(input = "ls")[0]"
p1.wait()

否则,请确保您的“run_server”脚本终止,以便您的脚本可以超越p1.wait()