我正在尝试打开Windows CMD并对其进行读写。 我设法用以下命令打开CMD:
import subprocess
proc = subprocess.Popen('cmd.exe')
要写入CMD控制台,我尝试了以下question解决方案:
proc.communicate('cd Documents')
此行会自动关闭CMD,因此我无法查看它是否有效。
如何读写Windows CMD?
答案 0 :(得分:1)
communicate
将缓冲区的内容发送到标准输入,然后关闭输入管道,最终终止该过程。因此,您无法与此互动。
此外,您必须将stdin
参数传递给Popen
或默认情况下,没有任何重定向。
import subprocess
proc = subprocess.Popen('cmd.exe',stdin=subprocess.PIPE)
现在您可以向proc.stdin
写行了(不要忘记python 3 compat的行终止符和二进制前缀),看看会发生什么
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()
这将发送命令,刷新标准输入(但不关闭它),然后等待消息打印,并要求按下一个键。之后,只要每次刷新并最后关闭,就可以发送更多命令。