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 后死亡。
我已经阅读了很多文档,但仍然不确定我做错了什么。
所以我有一个单独的 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 后死亡。