Um es kurz zu machen: pythonw.exe
tut nichts, python.exe
akzeptiert nichts (welches soll ich verwenden?)
test.py:
print "a"
CMD-Fenster:
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>
Bitte sag mir, was ich schrecklich falsch mache.
python
python-3.x
es funktioniert nicht
quelle
quelle
Antworten:
Wenn beim Ausführen Ihres Programms kein Terminalfenster angezeigt werden soll, verwenden Sie
pythonw.exe
;Andernfalls verwenden Sie
python.exe
In Bezug auf den Syntaxfehler:
print
ist jetzt eine Funktion in 3.xVerwenden Sie stattdessen:
quelle
Um die vorhandenen Antworten zusammenzufassen und zu ergänzen:
python.exe
ist eine Konsolenanwendung (Terminal) zum Starten von CLI-Skripten .python.exe
ein neues Konsolenfenster , sofern es nicht über ein vorhandenes Konsolenfenster ausgeführt wird .sys.stdin
,sys.stdout
undsys.stderr
sind in das Konsolenfenster verbunden .Die Ausführung ist synchron, wenn sie über ein
cmd.exe
oder ein PowerShell-Konsolenfenster gestartet wird : Siehe den ersten Kommentar von eryksun unten.pythonw.exe
ist eine GUI-App zum Starten von GUI / No-UI-at-All-Skripten .sys.stdin
,sys.stdout
undsys.stderr
sind NICHT vorhanden .print()
, dazu führen (in 3.x hat diesprint()
einfach keine Auswirkung).pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
(von PowerShell :)
cmd /c pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
zum Erfassen der Ausgabe von stdout und stderr in Dateien .Wenn Sie sicher sind, dass die Verwendung von
print()
der einzige Grund ist, mit dem Ihr Skript unbemerkt fehlschlägtpythonw.exe
, und Sie nicht an der Ausgabe von stdout interessiert sind, verwenden Sie den Befehl @ handle aus den Kommentaren:pythonw.exe yourScript.pyw 1>NUL 2>&1
Vorsichtsmaßnahme : Diese Ausgabeumleitungsmethode funktioniert nicht , wenn Sie
*.pyw
Skripte direkt aufrufen ( im Gegensatz zum Übergeben des Skriptdateipfads anpythonw.exe
). Siehe den zweiten Kommentar von eryksun und seine Folgemaßnahmen weiter unten.Sie können steuern, welche der ausführbaren Dateien Ihr Skript standardmäßig ausführt - beispielsweise beim Öffnen im Explorer -, indem Sie die richtige Dateinamenerweiterung auswählen :
*.py
Dateien werden standardmäßig zugeordnet (aufgerufen)python.exe
*.pyw
Dateien werden standardmäßig zugeordnet (aufgerufen)pythonw.exe
quelle
> pythonw ls.pyw >nul 2>&1
(obwohl nichts geschrieben ist).start
Befehl zu verwenden. Es überprüft tatsächlich den untergeordnetenPEB
Prozess, um festzustellen, ob es sich um einen Konsolenprozess handelt. Der Konsolenhostprozess (conhost.exe) kümmert sich nicht darum. Wenn Sie einesubprocess.Popen
anderepython.exe
Instanz an die aktuelle Konsole anhängen und diese nicht verwendenwait
, werden beide Prozesse verwirrend durcheinander geraten, um gleichzeitig auf die Konsole zuzugreifen.NtCreateUserProcess
. Wenn die ausführbare Zieldatei ein Konsolenprogramm ist, erbt das System bedingungslos die Standardhandles des übergeordneten Elements. Für ein Nicht-Konsolenprogramm muss jedoch ausdrücklich angewiesen werden, die vererbbaren Handles der Eltern zu erben. Um eine Datei basierend auf einer Dateizuordnung auszuführen, ruft cmd aufShellExecuteEx
, die beim Aufrufen nicht explizit Handles erbtCreateProcess
=>NtCreateUserProcess
. Folglich funktioniert das Umleiten von Standard-E / A in cmd, wenn Konsolen-.py-Skripte gestartet werden, jedoch keine Nicht-Konsolen-.pyw-Skripte.CreateProcess
mitbInheritHandles
übergeben alsTRUE
. Es greift nur dann zurück,ShellExecuteEx
wennCreateProcess
ein Fehler auftritt, da das Ziel keine ausführbare PE-Datei ist (z. B. ein .py-Skript) oder eine Erhöhung erfordert (z. B. osk.exe). Also , wenn Sie direkt ausführenpythonw.exe
oderpyw.exe
wird es CMDs erbenStandardInput
,StandardOutput
undStandardError
, was cmd (eigentlich die CRT) modifiziert überSetStdHandle
vor und nach dem Aufruf ,CreateProcess
wenn Standard - I / O zu einem Rohr umgeleitet wird, eine Datei oder Gerät.STARTUPINFO
cmd im Gegensatz zu Python nicht die Handles (hStdInput, hStdOutput, hStdErr) verwendetsubprocess.Popen
. Es kann damit durchkommen, weil es ein Single-Thread-Programm ist. Nur aufgrund dieses Designs funktioniert die Umleitung überhauptShellExecuteEx
(wie bereits erwähnt, nur für Konsolenprogramme), da die GUI-Shell-API ansonsten keine Unterstützung für Standard-E / A bietet.Siehe hier: http://docs.python.org/using/windows.html
pythonw.exe "Dies unterdrückt das Terminalfenster beim Start."
quelle
pythonw.exe
hat Nebenwirkungen, dass Ihr Programm möglicherweise stillschweigend fehlschlägt, wenn es in stdout / stderr stream schreibt - siehe bugs.python.org/issue706263Wenn Sie ein Python-Skript aus einem anderen Prozess (z. B. über die Befehlszeile) aufrufen möchten, verwenden Sie
pythonw.exe
. Andernfalls wird Ihrem Benutzer ständig eincmd
Fenster angezeigt, in dem der Python-Prozess gestartet wird. Ihr Skript wird trotzdem ausgeführt, die Benutzererfahrung wird jedoch nicht beeinträchtigt.Ein Beispiel könnte das Senden einer E-Mail sein.
python.exe
öffnet ein CLI-Fenster, sendet die E-Mail und schließt das Fenster. Es erscheint als schneller Blitz und kann als etwas nervig angesehen werden.pythonw.exe
vermeidet dies, sendet aber trotzdem die E-Mail.quelle
python.exe
wird nicht eine andere öffnen.Ich hatte eine Weile Mühe, dies zum Laufen zu bringen. Stellen Sie nach dem Ändern der Erweiterung in .pyw sicher, dass Sie die Eigenschaften der Datei öffnen und den Pfad "Öffnen mit" zu pythonw.exe leiten.
quelle
Nach meiner Erfahrung ist pythonw.exe zumindest mit Pygame schneller.
quelle