与python中的Windows CMD交互

时间:2018-09-13 19:03:55

标签: python windows cmd subprocess

我正在尝试打开W​​indows CMD并对其进行读写。 我设法用以下命令打开CMD:

import subprocess
proc = subprocess.Popen('cmd.exe')

要写入CMD控制台,我尝试了以下question解决方案:

proc.communicate('cd Documents')

此行会自动关闭CMD,因此我无法查看它是否有效。

如何读写Windows CMD?

1 个答案:

答案 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()

这将发送命令,刷新标准输入(但不关闭它),然后等待消息打印,并要求按下一个键。之后,只要每次刷新并最后关闭,就可以发送更多命令。