упаковка cmd.exe с подпроцессом - PullRequest
3 голосов
/ 08 января 2010

Я пытаюсь обернуть cmd.exe под windows следующей программой, но она не работает, кажется, что-то ждет и ничего не отображает. Есть идеи, что тут не так?

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

Ответы [ 3 ]

5 голосов
/ 08 января 2010
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-модуль ... и т. Д. Не вызывайте такие системные команды без необходимости , Это делает ваш код не переносимым.

5 голосов
/ 08 января 2010

Обычно, когда вы пытаетесь вызвать командную строку с реальной командой, проще просто вызвать ее с параметром "/ k", чем передавать команды через stdin. То есть просто назовите «cmd.exe / k dir». Например,

from os import *
a = popen("cmd /k dir")
print (a.read())

Приведенный ниже код делает то же самое, хотя ему не хватает строки для манипуляции, так как он передает данные напрямую:

from subprocess import *
Popen("cmd /k dir")
2 голосов
/ 08 января 2010

Это блокируется, потому что process.stdout.readlines() читает весь вывод процесса (пока он не завершится).Поскольку cmd.exe по-прежнему запущен, он постоянно ожидает его закрытия.

Чтобы это исправить, вы можете запустить отдельный поток для чтения вывода процесса.Это то, что вам нужно сделать, если вы не позвоните communicate(), чтобы избежать возможного тупика.Этот поток может повторно вызывать process.stdout.readline() и обрабатывать данные или отправлять их в основной поток для обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...