.pyw и pythonw не запускаются под Windows 7

Запуск простого файла .py или .pyw python вызывает python.exe для отображения в диспетчере задач.

python myApp.py
python myApp.pyw

Однако, когда мы пытаемся запустить его без использования консоли, script, похоже, не запускается, и не появляется python.exe или pythonw.exe в диспетчере задач

pythonw myApp.pyw
pythonw myApp.py

Как устранить проблему? В системе работает Python 2.7.8 x64.

Ответ 1

TL;DR

  • Чтобы устранить неполадки, используйте перенаправление вывода при вызове:

    pythonw myApp.py 1>stdout.txt 2>stderr.txt
    

Это будет записывать вывод stdout, например, из print(), в файл stdout.txt и вывод stderr (например, из необработанных исключений), в файл stderr.txt; от PowerShell, используйте cmd /c pythonw myApp.py 1>stdout.txt 2>stderr.txt).
Обратите внимание, что сам акт перенаправления stdout может сделать вашу работу script еще раз, если единственной причиной ее отказа с pythonw было использование print (в Python 2.x - см. Ниже).
Caveat. Этот метод перенаправления вывода, по-видимому, не работает при непосредственном вызове скриптов *.pyw (в отличие от передачи пути файла script к pythonw.exe). Дайте мне знать, знаете ли вы, почему и/или если он работает для вас.

  • Чтобы установить script:

Поместите следующее в начало любого Python 2.x или 3.x script, которое вы хотите выполнить с помощью pythonw.exe:

import sys, os
if sys.executable.endswith("pythonw.exe"):
  sys.stdout = open(os.devnull, "w");
  sys.stderr = open(os.path.join(os.getenv("TEMP"), "stderr-"+os.path.basename(sys.argv[0])), "w")

Это гарантирует следующее, когда script запускается с pythonw.exe:

  • print() вызовы и явные вызовы sys.stdout() эффективно игнорируются (не являются операциями).
  • Выход Stderr, в том числе из необработанного фатального исключения, отправляется в файл %TEMP%\stderr-<scriptFileName>; %TEMP% - стандартная переменная среды Windows, которая указывает на текущую папку пользователя для временных файлов.

Другими словами: с приведенным выше кодом проверить файл %TEMP%\stderr-<scriptFileName> после того, как ваш script отключился при вызове pythonw.exe.

Для пояснения прочитайте.


В Windows pythonw.exe предназначен для запуска сценариев GUI/no-UI-at-all, что означает, что стандартные входы и выходы - sys.stdin, sys.stdout, sys.stderr НЕ доступны.

У этого есть два неприятных побочных эффекта:

  • Использование print() - по умолчанию - sys.stdout - вызывает исключение в Python 2.x.
    • Эта проблема исправлена ​​в Python 3.x.
  • Любое необработанное исключение - в том числе одно, вызванное print() в 2.x - приводит к отключению script до без.
    • Сообщения об ошибках исключений переходят в sys.stderr по умолчанию, что является самой вещью, недоступной в этом сценарии.

Вышеупомянутый код исправляет эти проблемы с помощью:

  • отправка вывода stdout на нулевое устройство, эффективно игнорируя любую попытку вывода на sys.stdout - явно или неявно через print().

  • отправка всех файлов stderr во временный файл.


Различия между Python 2.x и Python 3.x:

Когда script запускается с pythonw.exe, sys.stdin, sys.stdout и sys.stderr:

  • в Python 2.x: есть недопустимые дескрипторы файлов
    • Конечным результатом при попытке записи на sys.stdout или sys.stderr является следующее исключение: IOError: [Errno 9] Bad file descriptor
    • Pitfall: из-за буферизации вывода это исключение может не отображаться до тех пор, пока вы не выведете, скажем, 4 Кбайта; вы можете вызвать его немедленно, вызвав pythonw.exe с помощью -u (для небуферизованного вывода).
    • print() слепо пытается sys.stdout (по умолчанию), поэтому он рано или поздно вызывает это исключение.
  • в Python 3.x: установлен на None
    • Это дополняется функцией 3.x print(), выполняющей no-op (ничего не делая), когда обнаруживает, что sys.stdout is None, так что операторы print() могут по умолчанию безопасно использоваться - они 'просто будет проигнорирован при запуске с pythonw.exe
    • Однако из этого следует, что попытка использовать sys.stdout.write() и sys.stderr.write() все еще приводит к исключению.

Подробнее см. здесь.

Ответ 2

Попробуйте добавить строку import sys; sys.stderr = open("errlog.txt", "w") в начало myApp.py. Затем зайдите в errlog.txt для трассировки или любых других сообщений об ошибках.

Ответ 3

Я столкнулся с одной и той же проблемой на script и обнаружил, что при добавлении вывода от ответа Росса script будет работать.

Похоже, что по какой-то причине перенаправление вывода устраняет проблему. Поскольку мне не интересно записывать вывод на диск, я вместо этого написал его на /dev/null (или эквивалент платформы) с помощью:

if ( sys.platform == 'win32' and sys.executable.split( '\\' )[-1] == 'pythonw.exe'):
    sys.stdout = open(os.devnull, 'w')
    sys.stderr = open(os.devnull, 'w')

Оператор if гарантирует, что это произойдет, только когда script запущен с pythonw.exe. Я не уверен, что это связано, но важно было сделать это перед другим импортом (включая, например, import logging).

Ответ 4

У меня была схожая проблема.

После отладки шаг за шагом, записав файл журнала, я обнаружил, что pythonw.exe разбился после утверждения, которое пыталось использовать вызов: sys.stdout.write(). Оказывается, при запуске с pythonw.exe sys.stdout имеет значение None.

Если вы используете функции sys.stdout/stderr/stdin и собираетесь использовать вашу программу с pythonw.exe, добавление проверки для "Нет" - хорошая идея.

Ответ 5

Я не уверен, что понимаю вашу проблему, но я думаю, что это то, что вам нужно знать.

вам нужно щелкнуть правой кнопкой мыши по файлу py или pyw и выбрать open с помощью... find python.exe(возможно, C:\Python27\python.exe).. установите флажок, который говорит всегда открывать... теперь вы может просто дважды щелкнуть по нему, если вы хотите запустить его

(обычно установщик устанавливает это для вас...)

Ответ 6

Это старый ответ, но я также хочу оставить свое решение:

  • Открыть CMD (с повышенными привилегиями или нет - зависит от ваших потребностей)
  • Изменить в каталог .py/.pyw script - это важно
  • Запустите pythonw с помощью script в качестве аргумента

    cd E:\my\script\folder\
    pythonw script.py
    

Ответ 7

У меня была аналогичная проблема после обновления до моей оперативной памяти компьютера. Оказывается, мне пришлось переустановить Pillow (библиотека, используемая для обработки изображений). Поэтому убедитесь, что он установлен, а если нет, установите его, используя "pip install Pillow" в cmd.