【问题标题】:wrapping cmd.exe with subprocess用子进程包装 cmd.exe
【发布时间】:2010-01-08 14:34:26
【问题描述】:

我尝试使用以下程序将 cmd.exe 包装在 windows 下,但它不起作用,它似乎在等待某些东西并且不显示任何东西。知道这里有什么问题吗?

import subprocess

process = subprocess.Popen('cmd.exe', shell=False, stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=None)  
process.stdin.write("dir\r\n")  
output = process.stdout.readlines()  
print output

【问题讨论】:

    标签: python windows subprocess


    【解决方案1】:

    通常在尝试使用实际命令调用命令提示符时,使用“/k”参数调用它比通过标准输入传递命令更简单。也就是说,只需调用“cmd.exe /k dir”。例如,

    from os import *
    a = popen("cmd /k dir")
    print (a.read())
    

    下面的代码做同样的事情,虽然缺少一个字符串供你操作,因为它直接通过管道输出:

    from subprocess import *
    Popen("cmd /k dir")
    

    【讨论】:

    • +1,打印输出比我使用操作代码收到的结果更具可读性。
    • 是的,但我需要的是能够围绕 cmd.exe shell 编写一个解释器循环。这就是我想重定向 stdin 或 stdout 的原因。知道如何在不每次都分叉外壳的情况下实现这一目标吗?
    【解决方案2】:
    process = subprocess.Popen('cmd.exe /k ', shell=True, stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=None)
    process.stdin.write("dir\n")
    o,e=process.communicate()
    print o
    process.stdin.close()
    

    顺便说一句,如果你的实际任务是做一个目录列表,请使用 Python 自己的 os 模块,例如 os.listdir() 或 glob 模块...等。不要不必要地调用这样的系统命令.它使您的代码不可移植。

    【讨论】:

    • 是的,我的问题应该更准确。如上所述,这个想法是将外壳包装在一个 iterp 循环中(可以将 cmd.exe 作为其他 bash 用于 inst。)
    【解决方案3】:

    这会被锁定,因为process.stdout.readlines() 会读取进程的所有输出(直到它终止)。由于 cmd.exe 仍在运行,它一直在等待它关闭。

    要解决此问题,您可以启动一个单独的线程来读取进程输出。如果您不调用communicate(),无论如何您都需要这样做,以避免可能的死锁。该线程可以反复调用process.stdout.readline()处理数据或发回主线程处理。

    【讨论】:

    • 我已经能够按照您的建议进行操作,但知道如何同步输入和输出?在查看下一个命令之前如何确保上一个命令问题已经完成。
    • 我不认为有一个解决方案可以 100% 起作用,因为子进程没有“等待下一个命令”的概念。我想您可以尝试检测 cmd.exe 提示符,但这是一个非常棘手的问题,并不总是有效。
    猜你喜欢
    • 2012-05-01
    • 2016-06-13
    • 2013-04-16
    • 2023-03-11
    • 2019-12-03
    • 2013-07-06
    • 2011-12-24
    • 2015-08-20
    • 1970-01-01
    相关资源
    最近更新 更多