Krótko mówiąc: pythonw.exe
nic nie robi, nic nie python.exe
akceptuje (którego powinienem użyć?)
test.py:
print "a"
Okno 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>
Proszę, powiedz mi, co robię strasznie źle.
python
python-3.x
itdoesntwork
źródło
źródło
Odpowiedzi:
Jeśli nie chcesz, aby okno terminala wyskakiwało po uruchomieniu programu, użyj
pythonw.exe
;W przeciwnym razie użyj
python.exe
Odnośnie błędu składni:
print
jest teraz funkcją w 3.x,więc użyj zamiast tego:
źródło
Podsumowując i uzupełniając istniejące odpowiedzi:
python.exe
to konsola (terminal) do uruchamiania skryptów typu CLI .python.exe
otwiera nowe okno konsoli .sys.stdin
,sys.stdout
isys.stderr
są podłączone do okna konsoli .Wykonywanie jest synchroniczne po uruchomieniu z
cmd.exe
okna konsoli lub PowerShell: Zobacz pierwszy komentarz eryksun poniżej.pythonw.exe
to aplikacja GUI do uruchamiania skryptów GUI / no-UI-at-all .sys.stdin
,sys.stdout
asys.stderr
to nie jest dostępna .print()
może spowodować, że tak się stanie (w 3.xprint()
po prostu nie ma efektu).pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
(z PowerShell:)
cmd /c pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
do przechwytywania danych wyjściowych stdout i stderr w plikach .Jeśli jesteś pewien, że użycie
print()
jest jedynym powodem, dla którego twój skrypt nie działa po cichupythonw.exe
, i nie jesteś zainteresowany wyjściem standardowym, użyj polecenia @ handle z komentarzy:pythonw.exe yourScript.pyw 1>NUL 2>&1
Uwaga : Ta technika przekierowania wyjścia nie działa podczas bezpośredniego wywoływania
*.pyw
skryptów ( w przeciwieństwie do przekazywania ścieżki do pliku skryptu do ). Zobacz drugi komentarz eryksun i jego następstwa poniżej.pythonw.exe
Możesz kontrolować, które z plików wykonywalnych domyślnie uruchamiają Twój skrypt - na przykład po otwarciu z Eksploratora - wybierając odpowiednie rozszerzenie nazwy pliku :
*.py
pliki są domyślnie skojarzone (wywoływane) zpython.exe
*.pyw
pliki są domyślnie skojarzone (wywoływane) zpythonw.exe
źródło
> pythonw ls.pyw >nul 2>&1
(nawet jeśli nic nie jest napisane).start
polecenia. W rzeczywistości sprawdzaPEB
proces potomny, aby określić, czy jest to proces konsoli. Proces hosta konsoli (conhost.exe) nie dba o to. Jeśli użyjeszsubprocess.Popen
do podłączenia innejpython.exe
instancji do bieżącej konsoli, a niewait
na niej, będziesz miał mylący bałagan obu procesów ścigających się, aby uzyskać dostęp do konsoli jednocześnie.NtCreateUserProcess
. Jeśli docelowy plik wykonywalny jest programem konsolowym, system bezwarunkowo dziedziczy standardowe uchwyty rodzica. Ale w przypadku programu innego niż konsola wymaga to wyraźnego polecenia, aby dziedziczenie dziedziczonych uchwytów rodzica. Aby uruchomić plik w oparciu o skojarzenie plików, wywołania cmdShellExecuteEx
, które nie dziedziczą jawnie uchwytów, gdy wywołujeCreateProcess
=>NtCreateUserProcess
. W konsekwencji przekierowanie standardowego wejścia / wyjścia działa w cmd podczas uruchamiania skryptów .py konsoli, ale nie w skryptach .pyw innych niż konsolowe.CreateProcess
zbInheritHandles
przekazywane jakoTRUE
. Powraca tylko wShellExecuteEx
przypadkuCreateProcess
niepowodzenia, ponieważ cel nie jest plikiem wykonywalnym PE (np. Jest to skrypt .py) lub wymaga podniesienia uprawnień (np. Osk.exe). Więc kiedy uruchomić bezpośredniopythonw.exe
lubpyw.exe
będzie dziedziczyć cmd-tychStandardInput
,StandardOutput
iStandardError
, co cmd (rzeczywiście CRT) modyfikuje poprzezSetStdHandle
przed i po wywołaniuCreateProcess
gdy standard I / O jest przekierowany do rur, pliku lub urządzenia.STARTUPINFO
uchwytów (hStdInput, hStdOutput, hStdErr), w przeciwieństwie do Pythonasubprocess.Popen
. Może to ujść na sucho, ponieważ jest to program jednowątkowy. Tylko z powodu tego projektu przekierowanie w ogóle działaShellExecuteEx
(tylko dla programów konsolowych, jak wspomniano), ponieważ interfejs API powłoki GUI w przeciwnym razie nie obsługuje standardowych operacji we / wy.Zobacz tutaj: http://docs.python.org/using/windows.html
pythonw.exe "To pomija okno terminala podczas uruchamiania."
źródło
pythonw.exe
ma efekty uboczne, że twój program może zawieść cicho, jeśli zapisuje do strumienia stdout / stderr - patrz bugs.python.org/issue706263Jeśli zamierzasz wywołać skrypt Pythona z innego procesu (powiedzmy z wiersza poleceń), użyj
pythonw.exe
. W przeciwnym razie użytkownik będzie stale widziećcmd
okno uruchamiające proces Pythona. Nadal będzie uruchamiał twój skrypt tak samo, ale nie przeszkadza to użytkownikowi.Przykładem może być wysłanie wiadomości e-mail;
python.exe
wyskoczy okno CLI, wyśle wiadomość e-mail, a następnie zamknie okno. Pojawi się jako szybki błysk i można go uznać za nieco denerwujący.pythonw.exe
unika tego, ale nadal wysyła wiadomość e-mail.źródło
python.exe
będzie nie otworzy kolejną.Przez jakiś czas starałem się, aby to zadziałało. Po zmianie rozszerzenia na .pyw, upewnij się, że otworzyłeś właściwości pliku i skieruj ścieżkę „otwórz za pomocą” na pythonw.exe.
źródło
Z mojego doświadczenia wynika, że pythonw.exe jest szybszy przynajmniej przy użyciu pygame.
źródło