2010-10-16 3 views
2

Я получаю немного странный результат от вызова subprocess.Popen, который, как я подозреваю, имеет много общего со мной, будучи совершенно новым для Python.Получение всего вывода из subprocess.Popen

args = [ 'cscript', '%USERPROFILE%\\tools\\jslint.js','%USERPROFILE%\\tools\\jslint.js' ] 
p = Popen(args, stdout=PIPE, shell=True).communicate()[0] 

Результаты в выходе, как в следующем (задней двойной \ г \ п есть в случае, если это важно)

Microsoft (R) Windows Script Host Version 5.8 
Copyright (C) Microsoft Corporation. All rights reserved.\r\n\r\n 

Если я запускаю эту команду из интерактивной оболочки Python это выглядит

>>> args = ['cscript', '%USERPROFILE%\\tools\\jslint.js', '%USERPROFILE%\\tools\jslint.js'] 
>>> p = subprocess.Popen(args, stdout=subprocess.PIPE, shell=True).communicate()[0] 
Lint at line 5631 character 17: Unexpected /*member 'OpenTextFile'. 
f = fso.OpenTextFile(WScript.Arguments(0), 1), 

... 

Lint at line 5649 character 17: Unexpected /*member 'Quit'. 
WScript.Quit(1); 

Таким образом, есть все выходные я на самом деле волнует, но если я сбросить значение «р» переменной я просто заносим ...

>>> p 
'Microsoft (R) Windows Script Host Version 5.8\r\nCopyright (C) Microsoft Corpor 
ation. All rights reserved.\r\n\r\n' 
>>> 

Где все эти данные, я хочу, чтобы все закончилось? Это определенно не закончилось в «р». Похоже, что это будет stdout, но я не сказал, чтобы я этого не делал?

Я бегу это на Windows 7 x64 с Python 2.6.6

ответ

5

Собираются ли стандартный вывод? Попробуйте перенаправлении:

p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True).communicate()[0] 
+0

Это должно быть 'p, e = Popen (...). Communication()' иначе вы сбрасываете stderr далеко –

+2

Не так, как я его написал - stderr перенаправляется на stdout. Вам нужно указать 'stderr = subprocess.PIPE', если вам нужны отдельные потоки. – SimonJ

+1

Если я только что вызвал .communicate() без переадресации stderr, это было не в кортеже, я вернулся. Однако перенаправление stderr сделало трюк, благодаря @SimonJ! – Tivac

3

Это, вероятно, будет stderr, как это было предложено SimonJ.

Кроме того, docs сказать не использовать shell=True в Windows, для вашего случая:

Исполняемый аргумент задает программу для выполнения. Очень редко требуется : Обычно программа для выполнения определяется аргументом args . Если shell = True, то исполняемый аргумент указывает, какую оболочку использовать . В Unix оболочка по умолчанию -/bin/sh. В Windows оболочка по умолчанию задается переменной среды COMSPEC . Единственный аргумент , который вам нужно указать shell = True в Windows - это команда , которую вы хотите выполнить, - это , фактически встроенная в оболочку, например dir, copy. Вам не требуется shell = True для запуска пакетного файла или для запуска исполняемого файла на основе консоли .


Позже: Ой, подождите. Используете ли вы оболочку для расширения этих переменных среды? Хорошо, я забираю его обратно: вам нужен shell=True.

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