2009-08-17 2 views
1

Возможно ли захватить выходные данные из wget и других программ командной строки, которые используют проклятия? Вот что я прямо сейчас:Запись вывода Python из wget?

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=0) 
for line in p.stdout: 
    print "a" 

Это прекрасно работает для программ, которые имеют простой выход, но не для Wget и других программ, которые используют ругательства.

+2

Я не думаю, что wget использует проклятия. Он просто печатает свои сообщения в stderr, а не в stdout. –

+0

Для случая wget это, вероятно, stderr, который вам нужно перехватить (см. Http://blog.doughellmann.com/2007/07/pymotw-subprocess.html для некоторых примеров). Для перехвата программ проклятий - я подозреваю, что очень утомительны, когда вам нужно подражать терминалу ... –

+0

Плохо, я думал, что для обновления существующей строки вам нужно было использовать проклятия. –

ответ

6

Я не считаю, что wget использует проклятия.

Обычно, когда я хочу использовать wget в сценарии я хотел бы использовать опцию -O -, чтобы заставить его вывод в стандартный вывод . Я подозреваю, что вы пытаетесь захватить текст, который обычно см. На вашей консоли, когда вы его запускаете, что будет stderr.

из командной строки, вне Python, просто запустите команду, как:

wget -O - http://www.somesite.org/ > /tmp/wget.out 2> /tmp/wget.err 

Затем посмотрите на два выходных файлов. Если вы видите какой-либо вывод от wget на своей консоли/терминале, то вы используете какой-то другой вкус команды, чем я видел.

Если, как я подозреваю, вас интересуют сообщения stderr, тогда у вас есть два варианта.

  • Изменения вашей команды, чтобы добавить-> & 1 и добавить shell=True к вашим Popen() аргументам
  • Альтернативно (и предпочтительно) добавить stderr=subprocess.PIPE своего Popen() аргументов

бывшее очень удобно, если вы weren» t с использованием stdout в любом случае (при условии, что вы используете wget для извлечения данных и записи их в файлы). В последнем случае вы читаете из файла stderr, чтобы получить ваши данные.

КСТАТИ: если вы действительно нужно захватить проклятий данные ... вы могли бы попробовать использовать стандартный PTy модуль, но я бы не рекомендовал это. Вы были бы гораздо лучше Извлечение pexpect модуль из:

И не отпугивает возраста или нумерации версий, он работает на Python 2.5 и 2.6 а также 2.4 и 2.3.

+0

Как мне его распечатать до завершения wget? –

+1

Определенно с pexpect, как я рекомендовал в других последних ответах - например. см. http://stackoverflow.com/questions/1283061 –

+1

Почему я должен добавить shell = True? Это совсем не удобно - и бесполезно вызывает новый процесс оболочки. – nosklo

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