pythonw 3.6.6 sys.stdout ничего не делает при переназначении - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь отладить мой скрипт pythonw, который я пишу, потому что он вроде работает при запуске его в режиме ожидания, но он вылетает при запуске через cmd или двойном щелчке по нему.код, который у меня есть в данный момент, это сбой

import sys
sys.stdout = open("mylog.txt", "w")
sys.stderr = open("errors.txt", "w")
print("hello world")
import thisisgonnafail
print(sys.executable)

Он создает файл, как мне говорит notepad ++, что файлы были обновлены, но оба файла всегда пусты, даже если онидолжно быть сообщение об ошибке при импорте, который настроен как сбой, и строка печати

1 Ответ

0 голосов
/ 02 апреля 2019

Код, который вы разместили выше, должен работать.Скорее всего, проблема в том, что вы проверяете файл, пока поток еще открыт.При использовании open() вам всегда нужно как-то закрыть поток.Пока вы не сделаете это, изменения в файле не будут видны вам при проверке его другим способом (например, открытием файла вручную).

В этом примере вы можете сделать это либо переназначивsys.stdout и sys.stderr или вызовом close() (предпочтительный метод, поскольку он более явный и предполагаемый способ обработки потоков) для них, например: sys.stdout.close().

Также имейте в виду, чтоесли вы будете открывать и закрывать их несколько раз, лучше использовать "a" для добавления к файлу, а не переписывать содержимое постоянно.

РЕДАКТИРОВАТЬ: Вы спрашивали вкомментарии об обработке ошибок при выполнении таких действий.Метод, который вы предложили, верен, вы можете try/except части кода и except закрыть поток.

import sys
sys.stderr = open("e.txt", "a")
try:
    import nonexistingmodule
    print 'Should not be printed out'
except:
    print 'Should be printed out'
    sys.stderr.close()

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

...