【问题标题】:Interact with the Windows CMD in python在 python 中与 Windows CMD 交互
【发布时间】:2019-02-18 13:46:31
【问题描述】:

我正在尝试打开一个 Windows CMD 并对其进行读/写。 我设法用这个命令打开了 CMD:

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

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

proc.communicate('cd Documents')

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

如何读写 Windows CMD?

【问题讨论】:

    标签: python windows cmd subprocess


    【解决方案1】:

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

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

    【讨论】:

    • 我尝试了您的代码,但它对我的不起作用。在以下行之后控制台仍然关闭:proc.stdin.write(b"cd Documents\n")
    • 试试完整的例子
    • 我尝试了你的完整示例,但它仍然关闭了 CMD:gyazo.com/f197465aedcb2de117af3fca1f258c35 (GIF)
    • 当然它会关闭 CMD。但是在完成工作之后。让我编辑。
    • 啊,我明白了。我将 proc.wait() 理解为导致 CMD 保持打开状态的行。类似于 C# 中的 console.ReadKey() 。
    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多