pyN*_*bie 5 python stdin popen
我是 python 新手,想打开 Windows cmd 提示符,启动一个进程,让该进程保持运行,然后向同一正在运行的进程发出命令。
命令将会改变,所以我不能只将这些命令包含在下面的 cmdline 变量中。另外,该进程需要 10-15 秒才能启动,因此我不想每次都浪费时间等待进程启动和运行命令。只想启动一次进程。并根据需要在同一进程中运行快速命令
我希望用它subprocess.Popen来完成这项工作,尽管我对更好的方法持开放态度。请注意,我要运行的进程不是 cmd,但我只是以此为例
import subprocess
cmdline = ['cmd', '/k']
cmd = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
cmd.stdin.write("echo hi") #would like this to be written to the cmd prompt
print cmd.stdout.readline() #would like to see 'hi' readback
cmd.stdin.write("echo hi again") #would like this to be written to the cmd prompt
print cmd.stdout.readline() #would like to see 'hi again' readback
Run Code Online (Sandbox Code Playgroud)
结果不是我所期望的。似乎 stdin.write 命令实际上并未进入,并且 readline 冻结,没有任何内容可读取。
我尝试过popen.communicate()使用 write/readline 代替,但它会终止该进程。我尝试在 Popen 行中设置 bufsize,但这并没有太大区别
如果你想实时查看输出,你需要使用iter:
import subprocess
cmdline = ['cmd', '/k']
cmd = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
cmd.stdin.write("echo hi\n")#would like this to be written to the cmd prompt
for line in iter(cmd.stdout.readline,""):
print line
cmd.stdin.write("echo hi again\n")#would like this to be written to the cmd prompt
Run Code Online (Sandbox Code Playgroud)
不确定您到底想做什么,但如果您想在获得某些输出时输入某些数据,那么我建议使用pexpect