communicate 将缓冲区的内容发送到标准输入,然后关闭输入管道,从而终止进程。所以你不能做一些与之交互的事情。
此外,您必须将stdin 参数传递给Popen,否则默认情况下不会重定向任何内容。
import subprocess
proc = subprocess.Popen('cmd.exe',stdin=subprocess.PIPE)
现在您可以向proc.stdin 写入行(不要忘记python 3 兼容的行终止符和二进制前缀。)看看会发生什么
proc.stdin.write(b"cd Documents\n")
(好吧,你可以使用 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()
这发送命令,刷新标准输入(但不关闭它)然后等待消息打印,并要求按下一个键。之后可以发送更多的命令,只要每次都刷新,最后关闭即可。