2012-04-24 3 views
11

Я хочу, чтобы иметь возможность получить содержимое на стандартный вывод и стандартный поток ошибок, когда я запускаю следующий сценарий на окнах с помощью pythonw.exe:Subprocess Popen не работает с pythonw.exe

import subprocess 
import sys 
import os 
import string 
import time 

tmpdir = 'c:/temp' 
cmd = 'dir c:' 

tmpfile = "tmp_%f" % (time.time()) 
tmpfile = os.path.normpath(os.path.join(tmpdir,tmpfile)) 
tmpfile2 = tmpfile+".bat" 
tmpfile3 = tmpfile+".txt" 

fa = open(tmpfile2,'w') 
fa.write("@ECHO OFF > NUL\n") 
fa.write('call '+cmd+"\n") 
fa.close() 

wcmd = [] 
wcmd.append(tmpfile2) 

startupinfo = subprocess.STARTUPINFO() 
startupinfo.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW 

fb = open(tmpfile3,'w') 
fb.write("\n") 
fb.write(tmpfile2+"\n") 

try: 
    procval = subprocess.Popen(wcmd, startupinfo=startupinfo, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate() 
    fb.write(str(procval)+"\n") 
    fb.write("Sucess") 
    fb.close() 
except: 
    fb.write(str(procval)+"\n") 
    fb.write("Failure") 
    fb.close() 

Когда я выполнить его с помощью питона .exe Я получаю ожидаемый результат. Когда я запускаю его с помощью pythonw.exe Я заканчиваю на стороне исключения. Если я запускаю popen только с помощью команды и флаги startupinfo, команда будет успешно завершена, но не будет доступа к данным в дочерних процессах. Все, что я прочитал, говорит, что это должно работать, но должно быть что-то упустить. Любая помощь будет принята с благодарностью.

Спасибо, Рэнди

+0

Вы случайно не зарегистрировали информацию об исключении? – jdi

+0

Я пробовал, но не удался. Это достаточно легко, чтобы реплицировать так, чтобы любые идеи о том, как получить информацию об исключении, и дадут ему шанс – user1352650

+0

Я не понимаю. У вас есть код, который попадает в общий, кроме блока, но вы не можете показать это исключение? Измените его на: «except Exception, e» и запишите e. Или просто поднимите в конце, чтобы вы могли видеть, что такое ошибка – jdi

ответ

10

Это, возможно, ошибка при использовании pythonw.exe

pythonw.exe запускает процесс демона, который не имеет нормального доступа к стандартным дескрипторов файлов. Единственное, что вам нужно будет сделать в вашем скрипте конкретно установить 3-ий для FD:

стандартного ввода
p = subprocess.Popen(wcmd, 
        startupinfo=startupinfo, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT, 
        stdin=subprocess.PIPE) 
procval = p.communicate() 
+0

Ссылка дает 404 :( – msiemens

4

(Несколько лет опоздали с этим ответом ...) Я перебежать с той же проблемой и нашел что вы должны заменить это:

STDOUT = subprocess.PIPE

с этим:

STDIN = суб process.PIPE

Вот моя догадка об основной проблеме: pythonw запускает процесс без stdin (имеет смысл, поскольку нет консоли). Подпроцесс пытается получить доступ к stdin, и это вызывает ошибку.

Альтернативой является использование/dev/null для stdin, см. Эту тему для обсуждения того, как это сделать: Ignoring output from subprocess.Popen (за исключением того, что вы хотите использовать devnull на stdin).

+0

вы можете быть на несколько лет позже с ответом, но это все еще помог мне :) –

Смежные вопросы