我尝试使用以下程序在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.stdout.readlines()
print output
答案 0 :(得分:5)
通常在尝试使用实际命令调用命令提示符时,使用“/ k”参数调用它更简单,而不是通过via stdin传递命令。也就是说,只需调用“cmd.exe / k dir”即可。例如,
from os import *
a = popen("cmd /k dir")
print (a.read())
下面的代码做了同样的事情,虽然缺少一个字符串供你操作,因为它管道直接输出:
from subprocess import *
Popen("cmd /k dir")
答案 1 :(得分:5)
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模块......等等。不要不必要地调用那样的系统命令。它使您的代码无法移植。
答案 2 :(得分:2)
这会锁定,因为process.stdout.readlines()
读取进程的所有输出(直到它终止)。由于cmd.exe仍在运行,因此它会一直等待它关闭。
要解决此问题,您可以启动一个单独的线程来读取进程输出。如果你不调用communicate()
,这是你需要做的事情,以避免可能的死锁。该线程可以重复调用process.stdout.readline()
并处理数据或将其发送回主线程进行处理。