wrapping cmd.exe with subprocess

18,741

Solution 1

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.

Solution 2

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")

Solution 3

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.

Share:
18,741
user246456
Author by

user246456

Updated on June 04, 2022

Comments

  • user246456
    user246456 almost 2 years

    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