我一直在阅读很多文件,但我仍然不确定我做错了什么。
所以我有一个单独的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之间进行某种等待并进行通信,因为服务器脚本将因同样的原因而终止。
答案 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()