在python中与Windows CMD交互

问题描述 投票:1回答:1

我正在尝试打开一个Windows CMD并读/写它。我设法用这个命令打开CMD:

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

要写入CMD控制台,我尝试了这个question的解决方案:

proc.communicate('cd Documents')

这条线自动关闭CMD,所以我无法看到它是否有效。

如何读取和写入Windows CMD?

python windows cmd subprocess
1个回答
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:\

如果你想让进程不要终止,你可以使用更多技巧:import subprocess,time

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

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

© www.soinside.com 2019 - 2024. All rights reserved.