communicate将缓冲区的内容发送到标准输入,然后关闭输入管道,从而终止进程。所以你不能做一些互动的事情。在
此外,必须将stdin参数传递给Popen,否则默认情况下不会重定向任何内容。在import subprocess
proc = subprocess.Popen('cmd.exe',stdin=subprocess.PIPE)
现在您可以向proc.stdin(别忘了python3compat的行终止符和二进制前缀),看看会发生什么
^{pr2}$
(好的,您可以在这个例子中使用cwd="Documents",但这是为了示例的缘故)
在这个例子中,输出是重定向的。这意味着您将在当前控制台中看到输出。不要忘了close标准输入,否则它将不起作用(可能是因为当python退出时缓冲区没有刷新和/或管道被破坏)。然后用wait()等待进程结束
完整示例:import subprocess
proc = subprocess.Popen('cmd.exe',stdin=subprocess.PIPE)
proc.stdin.write(b"cd ..\n")
# do some stuff in between...
proc.stdin.write(b"cd\n")
proc.stdin.close()
proc.wait()
在我的电脑上打印出来了(对不起我的法语)Microsoft Windows [version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Tous droits réservés.
L:\so>cd ..
L:\>cd
L:\
如果不希望进程终止,可以使用更多技巧:
导入子流程,时间proc = subprocess.Popen('cmd.exe',stdin=subprocess.PIPE)
proc.stdin.write(b"cd ..\n")
proc.stdin.write(b"cd\n")
proc.stdin.flush()
time.sleep(1)
input("press return")
proc.stdin.write(b"cd\n")
proc.stdin.flush()
proc.stdin.close()
proc.wait()
它发送命令,刷新标准输入(但不关闭),然后等待消息打印,并要求按键。你可以发送更多的命令,只要你每次刷新,最后关闭。在