Короче говоря: 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>
Пожалуйста, скажите мне, что я делаю ужасно неправильно.
python
python-3.x
itdoesntwork
источник
источник
Ответы:
Если вы не хотите, чтобы окно терминала появлялось при запуске вашей программы, используйте
pythonw.exe
;В противном случае используйте
python.exe
Что касается синтаксической ошибки:
print
теперь это функция в 3.x,поэтому используйте вместо:
источник
Подводя итог и дополнить существующие ответы:
python.exe
является (терминал) консольное приложение для запуска сценариев CLI-типа .python.exe
откроется новое окно консоли .sys.stdin
,sys.stdout
иsys.stderr
которые подключены к окну консоли .Выполнение происходит синхронно при запуске из
cmd.exe
окна консоли или PowerShell: см. Первый комментарий eryksun ниже.pythonw.exe
это GUI приложение для запуска GUI / не-UI-на-всех сценариев .sys.stdin
,sys.stdout
иsys.stderr
являются не доступны .print()
может привести к этому (в 3.xprint()
просто не действует).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()
- единственная причина, по которой ваш скрипт молча терпит неудачуpythonw.exe
, и вас не интересует вывод stdout, используйте команду @ handle из комментариев:pythonw.exe yourScript.pyw 1>NUL 2>&1
Caveat : Этот метод перенаправления вывода не работает при непосредственном вызове
*.pyw
скриптов ( в отличие от передачи пути к файлу сценария ). См. 2 -й комментарий eryksun и его последующие действия ниже.pythonw.exe
Вы можете контролировать, какой из исполняемых файлов запускает ваш скрипт по умолчанию - например, при открытии из Explorer - выбрав правильное расширение имени файла :
*.py
файлы по умолчанию связаны (вызываются) сpython.exe
*.pyw
файлы по умолчанию связаны (вызываются) сpythonw.exe
источник
> pythonw ls.pyw >nul 2>&1
(хотя ничего не написано).start
команды. Он фактически проверяетPEB
дочерний процесс, чтобы определить, является ли он консольным процессом. Процесс хоста консоли (conhost.exe) не заботится об этом. Если вы используетеsubprocess.Popen
для подключения другогоpython.exe
экземпляра к текущей консоли, а неwait
на нем, то у вас будет запутанный беспорядок в обоих процессах, стремящихся одновременно получить доступ к консоли.NtCreateUserProcess
. Если целевой исполняемый файл является консольной программой, система безоговорочно наследует стандартные дескрипторы родителя. Но для неконсольной программы требуется явное указание наследовать наследуемые дескрипторы родителя. Чтобы запустить файл на основе файловой ассоциации, вызывается cmdShellExecuteEx
, который явно не наследует дескрипторы при вызовеCreateProcess
=>NtCreateUserProcess
. Следовательно, перенаправление стандартного ввода-вывода работает в cmd при запуске консольных сценариев .py, но не не-консольных .pyw.CreateProcess
сbInheritHandles
передается какTRUE
. Он возвращается только вShellExecuteEx
случаеCreateProcess
сбоя, поскольку цель не является исполняемым файлом PE (например, это скрипт .py) или требует повышения прав (например, osk.exe). Поэтому , когда вы непосредственно работатьpythonw.exe
илиpyw.exe
он будет наследовать CMD - хStandardInput
,StandardOutput
иStandardError
, что CMD ( на самом деле ЭЛТ) модифицирует черезSetStdHandle
до и после вызова ,CreateProcess
когда стандартный ввод / вывод перенаправляется на трубы, файл или устройство.STARTUPINFO
дескрипторы (hStdInput, hStdOutput, hStdErr), в отличие от Pythonsubprocess.Popen
. Это может сойти с рук, потому что это однопоточная программа. Только благодаря этой конструкции перенаправление работает вообщеShellExecuteEx
(только для консольных программ, как уже отмечалось), потому что API оболочки графического интерфейса в противном случае не поддерживает стандартный ввод-вывод.Смотрите здесь: http://docs.python.org/using/windows.html
pythonw.exe "Это подавляет окно терминала при запуске."
источник
pythonw.exe
имеет побочные эффекты, из-за которых ваша программа может молчать, если она пишет в поток stdout / stderr - см. bugs.python.org/issue706263Если вы собираетесь вызывать скрипт Python из какого-либо другого процесса (скажем, из командной строки), используйте
pythonw.exe
. В противном случае ваш пользователь будет постоянно видетьcmd
окно запуска процесса python. Он по-прежнему будет запускать ваш скрипт точно так же, но он не будет влиять на пользовательский опыт.Примером может быть отправка электронного письма;
python.exe
появится окно CLI, отправьте электронное письмо, затем закройте окно. Он будет выглядеть как быстрая вспышка, и его можно считать несколько раздражающим.pythonw.exe
избегает этого, но все равно отправляет электронное письмо.источник
python.exe
будет не открыть еще один.Я изо всех сил пытался заставить это работать некоторое время. После того, как вы измените расширение на .pyw, убедитесь, что вы открыли свойства файла и направили открытый путь к pythonw.exe.
источник
По моему опыту pythonw.exe быстрее по крайней мере с использованием pygame.
источник