繁体   English   中英

用子进程包装cmd.exe

[英]wrapping cmd.exe with 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

通常在尝试使用实际命令调用命令提示符时,使用“/ 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")
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模块......等等。不要不必要地调用那样的系统命令。 它使您的代码不可移植。

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

要解决此问题,您可以启动一个单独的线程来读取进程输出。 如果你不调用communicate() ,这是你需要做的事情,以避免可能的死锁。 该线程可以重复调用process.stdout.readline()并处理数据或将其发送回主线程进行处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM