2016-12-08 7 views
1

У меня есть питон скрипт (назовем его my_python_script.py), который печатает несколько сообщений с помощьюПочему stderr в subprocess.check_call получает потоки stderr и stdout?

print message_string 

Он также выводит процент прогресса с использованием

sys.stdout.write(progress_string) 

Когда это будет сделано, он выводит некоторую статистику и потому, что я потом хочу собрать тех, кто в файле с помощью stderr, я использую

sys.stderr.write(stats_string) 

Теперь, в другом сценарии я называю A Бова скрипт с subprocess.check_call() как этого

file_obj = open('stats.log', 'a') 
check_call(['my_python_script.py'], stderr=file_obj) 
file_obj.close() 

К моему удивлению, file_obj содержит каждый выход из my_python_script.py включая print выход, sys.stdout.write выхода и sys.stderr.write выхода. Я ожидал, что он будет содержать только результат от sys.stderr.write.

Почему это не так? check_call перенаправляет stderr на stdout по умолчанию?

Если есть легкое исправление, я был бы счастливым туристом. Благодарю.

Кстати, я использую Python 2.7 для Linux Fedora.

+0

Если у вас есть сценарий print 'sys.stdout.fileno()' и 'sys.stderr.fileno()' они выглядят одинаково? –

ответ

0

Мои искренние извинения сообществу !!

Это была полная ошибка с моей стороны.

Ключ к этой ошибке был двояким.

Часть один была это определением

file_obj = open('stats.log', 'a') 

Обратите внимание на «а» - это преднамеренная, но часть проблемы. Во-вторых, я забыл удалить полученный файл после завершения (он должен быть временным и в конце будет скопирован в другое место). Из-за этого все мои тестовые прогоны накапливаются в этот файл, включая исходный, где я использовал stdout.

О, господин. Поэтому возникает вопрос: следует ли удалить исходный вопрос или он может быть полезен для иллюстративных целей? Теперь это кажется таким глупым.

+0

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

+0

Я пробовал, но мне было запрещено. Вместо этого я отметил это для внимания модератора. –

0

Вы можете попробовать добавить опцию стандартный вывод, а также:

check_call(['my_python_script.py'], stdout=anotherfile_obj, stderr=file_obj) 

Я думаю, что check_call лечит stderr, как stdoutstdout, когда не указано.

Либо это, либо ваш сценарий печати на stderr по умолчанию

+0

Tried stdout = PIPE. Это не работает. –

+1

'PIPE', возможно, не лучший тест, так как [документация явно предупреждает об использовании его с помощью' check_call'] (https://docs.python.org/2/library/subprocess.html#subprocess.check_call) –

+0

I знать. Это может зайти в тупик.Тем не менее, это был быстрый способ проверить вашу теорию ;-) –