pythonw.exe or python.exe?
To summarize and complement the existing answers:
-
python.exe
is a console (terminal) application for launching CLI-type scripts (console applications).-
Unless run from an existing console window,
python.exe
opens a new console window. -
Standard streams
sys.stdin
,sys.stdout
andsys.stderr
are connected to the console window. -
Execution is synchronous when launched from a
cmd.exe
or PowerShell console window: See eryksun's 1st comment below.- If a new console window was created, it stays open until the script terminates.
- When invoked from an existing console window, the prompt is blocked until the script terminates.
-
-
pythonw.exe
is a GUI app for launching GUI/no-UI-at-all scripts.- NO console window is opened.
- Execution is asynchronous:
- When invoked from a console window, the script is merely launched and the prompt returns right away, whether the script is still running or not.
-
Standard streams
sys.stdin
,sys.stdout
andsys.stderr
are NOT available.-
Caution: Unless you take extra steps, this has potentially unexpected side effects:
- Unhandled exceptions cause the script to abort silently.
-
In Python 2.x, simply trying to use
print()
can cause that to happen (in 3.x,print()
simply has no effect).- To prevent that from within your script, and to learn more, see this answer of mine.
-
Ad-hoc, you can use output redirection:Thanks, @handle.
pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
(from PowerShell:cmd /c pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
) to capture stdout and stderr output in files.
If you're confident that use ofprint()
is the only reason your script fails silently withpythonw.exe
, and you're not interested in stdout output, use @handle's command from the comments:pythonw.exe yourScript.pyw 1>NUL 2>&1
Caveat: This output redirection technique does not work when invoking*.pyw
scripts directly (as opposed to by passing the script file path topythonw.exe
). See eryksun's 2nd comment and its follow-ups below.
-
Caution: Unless you take extra steps, this has potentially unexpected side effects:
You can control which of the executables runs your script by default - such as when opened from Explorer - by choosing the right filename extension:
-
*.py
files are by default associated (invoked) withpython.exe
-
*.pyw
files are by default associated (invoked) withpythonw.exe
If you don't want a terminal window to pop up when you run your program, use pythonw.exe
;
Otherwise, use python.exe
Regarding the syntax error: print
is now a function in 3.x
So use instead:
print("a")
See here: http://docs.python.org/using/windows.html
pythonw.exe "This suppresses the terminal window on startup."