Pythonw.exe или python.exe?

Короче говоря: pythonw.exe ничего не делает, python.exe ничего не принимает (какой я должен использовать?)

test.py:

print "a"

Окно CMD:

C:\path>pythonw.exe test.py
<BLANK LINE>
C:\path>

C:\path>python.exe test.py
  File "C:\path\test.py", line 7
    print "a"
            ^
SyntaxError: invalid syntax

C:\path>

Скажите, пожалуйста, что я делаю ужасно неправильно.

Ответ 1

Если вы не хотите, чтобы окно терминала всплывало при запуске вашей программы, используйте pythonw.exe.
В противном случае используйте python.exe

Относительно синтаксической ошибки: print теперь является функцией в 3.x
Поэтому используйте вместо этого:

print("a")

Ответ 2

Подведение итогов и дополнение существующих ответов:

  • python.exe - это консольное (терминальное) приложение для запуска сценариев типа CLI.

    • Если вы не запускаете из существующего окна консоли, python.exe открывает новое окно консоли.
    • Стандартные потоки sys.stdin, sys.stdout и sys.stderr подключены к окну консоли.
    • Выполнение синхронно при запуске из окна консоли cmd.exe или PowerShell: См. eryksun 1 комментарий ниже.

      • Если появилось новое окно консоли, оно остается открытым до тех пор, пока script не завершится.
      • При вызове из существующего окна консоли приглашение блокируется до завершения script.
  • pythonw.exe - графическое приложение для запуска сценариев GUI/no-UI-at-all.

    • Откроется окно консоли консоли.
    • Выполнение асинхронно:
      • Когда вызывается из окна консоли, script запускается просто, и приглашение сразу возвращается, остается ли script или нет.
    • Стандартные потоки sys.stdin, sys.stdout и sys.stderr НЕ доступны.
      • Предостережение: Если вы не выполняете дополнительные шаги, у этого есть потенциально неожиданные побочные эффекты:
        • Необработанные исключения приводят к script отменить молчание.
        • В Python 2.x просто попытка использовать print() может привести к тому, что это произойдет (в 3.x, print() просто не действует).
        • Чтобы предотвратить это изнутри script, и узнать больше, см. этот ответ моего.
        • Ad-hoc, вы можете использовать перенаправление вывода: Спасибо, @handle.
          pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
          (от PowerShell:
          cmd /c pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt), чтобы фиксировать вывод stdout и stderr в файлах.
          Если вы уверены, что использование print() является единственной причиной, по которой ваш script терпит неудачу с pythonw.exe, и вы не заинтересованы в выводе stdout, используйте команду @handle из комментариев:
          pythonw.exe yourScript.pyw 1>NUL 2>&1
          Caveat. Этот метод перенаправления вывода не работает при непосредственном вызове сценариев *.pyw (в отличие от передачи пути script к pythonw.exe). См. eryksun 2-й комментарий и последующие действия ниже.

Вы можете контролировать, какой из исполняемых файлов запускает ваш script по умолчанию - например, при открытии из проводника - , выбирая правильное расширение имени файла:

  • *.py файлы по умолчанию связаны (вызывается) с помощью python.exe
  • *.pyw файлы по умолчанию связаны (вызывается) с помощью pythonw.exe

Ответ 4

Если вы собираетесь вызывать python script из какого-либо другого процесса (например, из командной строки), используйте pythonw.exe. В противном случае ваш пользователь будет постоянно видеть окно cmd, запускающее процесс python. Он все равно будет запускать ваш script точно так же, но он не будет вторгаться в пользовательский интерфейс.

Примером может быть отправка электронной почты; python.exe появится окно CLI, отправьте электронное письмо, затем закройте окно. Он будет выглядеть как быстрая вспышка и может считаться несколько раздражающим. pythonw.exe избегает этого, но все равно отправляет электронное письмо.

Ответ 5

Я изо всех сил пытался заставить это работать некоторое время. После того, как вы измените расширение на .pyw, убедитесь, что вы открываете свойства файла и направляете путь "open to" к pythonw.exe.