Невозможно перенаправить вывод при запуске скрипта Python в Windows, используя только имя скрипта - PullRequest
21 голосов
/ 11 июня 2010

Это работает в Windows 7 (64 бит), Python 2.6 с расширениями Win32 для Python.

У меня есть простой скрипт, который просто печатает "привет мир". Я могу запустить его с python hello.py. В этом случае я могу перенаправить вывод в файл. Но если я запускаю его, просто набрав hello.py в командной строке и перенаправив вывод, я получу исключение.

C:> python hello.py
hello world

C:> python hello.py >output

C:> type output
hello world

C:> hello.py
hello world

C:> hello.py >output
close failed in file object destructor:
Error in sys.excepthook:

Original exception was:

Я думаю, что сначала я получаю эту ошибку после обновления до Windows 7. Я помню, она должна работать в XP. Я видел, как люди говорили об этой ошибке python-Bugs-1012692 | Невозможно передать входные данные программе Python . Но это было давно. И в нем не упоминается ни одно решение.

Кто-нибудь испытывал это? Кто-нибудь может помочь?

Ответы [ 4 ]

17 голосов
/ 12 июня 2010

Вы спрашиваете об этом?

Windows: при выполнении сценариев Python в командной строке с использованием сопоставлений типов файлов (т. Е. Запуск «script.py» вместо «python script.py»),перенаправления могут не работать, если вы не зададите определенный раздел реестра.См. Статью базы знаний Перенаправление STDIN / STDOUT может не работать, если он запущен из файловой ассоциации .

Это в README Python.Возможно, этот патч - то, что вы ищете.

8 голосов
/ 11 июня 2010

ОБНОВЛЕННЫЙ ОТВЕТ

Проблема Microsoft KB ( Перенаправление STDIN / STDOUT может не работать при запуске из ассоциации файлов ) может быть именно этой проблемой.На этой странице есть инструкции по загрузке исправлений для Win2000, но это может не потребоваться в более поздних версиях Windows.После исправления (или, возможно, без него, в зависимости от вашей версии Win) требуется ручное редактирование реестра.

Вам следует проверить предоставленную мной ссылку;в любом случае, я суммирую здесь:

  • Откройте редактор реестра и найдите ключ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
  • Добавьте значение DWORD с именем InheritConsoleHandles и установите его на 1.

Вот так, предположительно.

0 голосов
/ 02 мая 2013

Если вы пытаетесь перенаправить stdout и stderr из командной строки, см. http://support.microsoft.com/kb/110930

0 голосов
/ 11 июня 2010

Я не знаю об этой проблеме, но у меня есть идея обойти ее.Задумывались ли вы о добавлении параметра командной строки (например, -o) для указания выходного файла, который будет захватывать выходные данные?

...