Reputation: 285
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
Upvotes: 3
Views: 21682
Reputation: 110108
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.
Upvotes: 2
Reputation: 342363
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.
Upvotes: 5
Reputation: 25834
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")
Upvotes: 5