wrapping cmd.exe with subprocess
I try to wrap cmd.exe under windows with the following program but it doesn't work , it seems to wait for something and doesn't display anything. Any idea what is wrong here ?
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
Usually when trying to call command prompt with an actual command, it is simpler to just call it with the "/k" parameter rather than passing commands in via stdin. That is, just call "cmd.exe /k dir". For example,
from os import *
a = popen("cmd /k dir")
print (a.read())
The code below does the same thing, though lacks a string for you to manipulate, since it pipes to output directly:
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()
by the way, if your actual task is really to do a directory listing, please use Python's own os module, eg os.listdir(), or glob module... etc. Don't call system commands like that unnecessarily. It makes your code not portable.
This locks up because process.stdout.readlines()
reads all output by the process (until it terminates). Since cmd.exe is still running, it keeps waiting forever for it to close.
To fix this, you can start a separate thread to read the process output. This is something you need to do anyway if you don't call communicate()
, to avoid possible deadlock. This thread can call process.stdout.readline()
repeatedly and handle the data or send it back to the main thread for handling.
精彩评论