user246456
user246456

Reputation: 285

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

Upvotes: 3

Views: 21682

Answers (3)

interjay
interjay

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

ghostdog74
ghostdog74

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

Brian
Brian

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

Related Questions