用子进程包装cmd.exe

时间:2010-01-08 14:34:26

标签: 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.stdout.readlines()  
print output

3 个答案:

答案 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()并处理数据或将其发送回主线程进行处理。