Python 用子进程包装cmd.exe
我尝试用下面的程序在windows下包装cmd.exe,但它不起作用,它似乎在等待什么,并且没有显示任何内容。你知道这里怎么了吗Python 用子进程包装cmd.exe,python,windows,subprocess,Python,Windows,Subprocess,我尝试用下面的程序在windows下包装cmd.exe,但它不起作用,它似乎在等待什么,并且没有显示任何内容。你知道这里怎么了吗 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.stdou
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
通常,在尝试使用实际命令调用命令提示符时,只使用“/k”参数调用命令提示符比通过stdin传递命令更简单。也就是说,只需调用“cmd.exe/k dir”。比如说,
from os import *
a = popen("cmd /k dir")
print (a.read())
下面的代码也做了同样的事情,但缺少一个字符串供您操作,因为它直接通过管道输出:
from subprocess import *
Popen("cmd /k dir")
顺便说一句,如果您的实际任务是列出目录,请使用Python自己的操作系统模块,例如os.listdir()或glob模块。。。等等。不要像那样不必要地调用系统命令。它使您的代码不可移植。这会锁定,因为
process.stdout.readlines()
读取进程的所有输出(直到它终止)。由于cmd.exe仍在运行,它会一直等待它关闭
要解决这个问题,您可以启动一个单独的线程来读取进程输出。如果不调用
communicate()
,则无论如何都需要这样做,以避免可能的死锁。这个线程可以反复调用process.stdout.readline()
,并处理数据或将其发送回主线程进行处理。+1,打印输出比我使用op的代码收到的结果更可读。是的,这是可行的,但我需要能够围绕cmd.exe shell编写一个解释器循环。这就是为什么我想重定向stdinoustdout。你知道如何做到这一点而不必每次都掏壳吗?是的,我的问题应该更准确。如上所述,这个想法是将shell包装在一个iterp循环中(可以是cmd.exe,作为bash for inst的其他内容)。我已经能够按照您的建议执行,但是知道如何同步输入和输出吗?如何在查看下一个命令之前确保上一个命令问题已经完成。我不认为有一个解决方案可以100%解决这个问题,因为子流程没有“等待下一个命令”的概念。我想您可以尝试检测cmd.exe提示符,但这是一个相当复杂的问题,而且不总是有效的。
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()