Python subprocess.Popen 不工作

Python subprocess.Popen not working

我已经阅读了很多文档,但仍然不确定我做错了什么。

所以我有一个单独的 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,但是 运行s 服务器检测到的脚本eof 在 tty 上并自行终止。我必须在 Popen 和通信之间进行某种等待,因为服务器脚本将出于同样的原因终止。

事实是,当您按 Ctrl+C 并且回溯显示您卡在 wait() 中时,这意味着下一行正在执行,下一行是 wait()。 wait() 不会 return 直到你的 p1 处理 returns。但是,在您向它发送命令之前,您的 p1 进程似乎不会 return,在您的情况下为 '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()

p.wait() 不会 return 直到子进程结束。当父脚本卡在 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() 已 returned 后死亡。