Я пытаюсь отладить свой скрипт pythonw, который я пишу, потому что он работает при запуске через режим ожидания, но падает при запуске через cmd или двойном щелчке по нему. код, который у меня есть на данный момент, не работает
import sys
sys.stdout = open("mylog.txt", "w")
sys.stderr = open("errors.txt", "w")
print("hello world")
import thisisgonnafail
print(sys.executable)
Он создает файл, как мне говорит блокнот ++, что файлы были обновлены, но оба файла всегда пусты, даже если они должны иметь сообщение об ошибке из импорта, настроенного на сбой, и строку печати
потому что с pythonw нет консоли, по крайней мере, когда она не работает из режима ожидания






Код, который вы разместили выше, должен работать. Проблема, с которой вы столкнулись, скорее всего, связана с проверкой файла, когда поток все еще открыт. При использовании 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()
Этот вышеприведенный код позволяет вам проверить, был ли активирован путь исключения.
как бы я справился с этим, если есть ошибка? просто напишите попробуйте поймать все это, а затем в улове закрыть файл?
Да, это правильно. Я добавлю пример кода, чтобы проверить это в ответ.
Я в замешательстве, почему вы перезаписываете встроенные?