使用subprocess包装cmd.exe
我尝试用下面这个程序来包装 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
3 个回答
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模块等等。不要随便调用系统命令,这样会让你的代码变得不易移植。
5
通常,当你想用一个实际的命令来打开命令提示符时,直接使用 "/k" 参数会更简单,而不是通过输入流传递命令。也就是说,你可以直接输入 "cmd.exe /k dir" 来执行命令。例如,
from os import *
a = popen("cmd /k dir")
print (a.read())
下面的代码做的事情和上面一样,不过它没有给你一个可以操作的字符串,因为它直接把结果输出了:
from subprocess import *
Popen("cmd /k dir")
2
这个问题出现是因为 process.stdout.readlines()
会一直读取进程的所有输出,直到这个进程结束。由于 cmd.exe 还在运行,它就一直在等待,结果就卡住了。
要解决这个问题,你可以启动一个单独的线程来读取进程的输出。如果你不调用 communicate()
,其实你本来就需要这样做,以避免可能出现的死锁。这个线程可以反复调用 process.stdout.readline()
来获取数据,处理这些数据,或者把数据发送回主线程进行处理。