pythonw.exe或python.exe?

itd*_*ork 148 python python-3.x

长话短说:pythonw.exe什么都不做,python.exe什么都不接受(我应该使用哪一个?)

test.py:

print "a"
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

请告诉我,我做错了什么.

mkl*_*nt0 261

总结和补充现有答案:

  • python.exe用于启动CLI类型脚本的控制台(终端)应用程序.

    • 除非从现有控制台窗口运行,否则python.exe 将打开一个新的控制台窗口.
    • 标准流 sys.stdin,sys.stdout并且sys.stderr连接到控制台窗口.
    • 从PowerShell控制台窗口启动时执行是同步的cmd.exe:请参阅下面的eryksun的第一条评论.

      • 如果创建了新的控制台窗口,它将保持打开状态,直到脚本终止.
      • 从现有控制台窗口调用时,提示将被阻止,直到脚本终止.
  • pythonw.exe是一个GUI应用程序,用于启动GUI/no-UI-at-all脚本.

    • 没有打开控制台窗口.
    • 执行是异步的:
      • 从控制台窗口调用时,仅启动脚本并立即返回提示,无论脚本是否仍在运行.
    • 标准流 sys.stdin,sys.stdout并且sys.stderr不可用.
      • 警告:除非您采取额外步骤,否则可能会产生意外的副作用:
        • 未处理的异常会导致脚本以静默方式中止.
        • 在Python 2.x中,只是尝试使用print()会导致这种情况发生(在3.x中,print()根本没有效果).
        • 要从脚本中防止这种情况,并了解更多信息,请参阅我的这个答案.
        • 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()是你的脚本就会失败的唯一原因pythonw.exe,而你不感兴趣的标准输出的输出,从注释使用@拉手的命令:
          pythonw.exe yourScript.pyw 1>NUL 2>&1
          买者:这个输出重定向技术并没有调用时工作*.pyw的脚本直接(而不是通过传递脚本文件路径pythonw.exe).请参阅eryksun的第二条评论及其后续跟进.

您可以通过选择正确的文件扩展名控制默认情况下运行脚本的哪些可执行文件 - 例如从资源管理器中打开时:

  • *.py 默认情况下,文件与关联(调用) python.exe
  • *.pyw 默认情况下,文件与关联(调用) pythonw.exe

  • 用户模式进程由系统调用`NtCreateUserProcess`创建.如果目标可执行文件是控制台程序,则系统无条件地继承父标准句柄.但对于非控制台程序,它需要明确告知继承父级的可继承句柄.要运行基于文件关联的文件,cmd调用`ShellExecuteEx`,它在调用`CreateProcess` =>`NtCreateUserProcess`时不显式继承句柄.因此,在启动控制台.py脚本但不是非控制台.pyw脚本时,重定向标准I/O在cmd中工作. (2认同)
  • cmd shell首先尝试[`CreateProcess`](https://msdn.microsoft.com/en-us/library/ms682425),将`bInheritHandles`传递为`TRUE`.当`CreateProcess`失败时,它只会回到`ShellExecuteEx`,因为目标不是PE可执行文件(例如,它是.py脚本)或需要提升(例如osk.exe).因此,当你直接运行`pythonw.exe`或`pyw.exe`时,它将继承cmd的`StandardInput`,`StandardOutput`和`StandardError`,cmd(实际上是CRT)在调用之前和之后通过`SetStdHandle`修改当标准I/O被重定向到管道,文件或设备时,"CreateProcess". (2认同)
  • 请注意,与Python的`subprocess.Popen`不同,cmd不使用[`STARTUPINFO`](https://msdn.microsoft.com/en-us/library/ms686331)句柄(hStdInput,hStdOutput,hStdErr).它可以逃脱这个因为它是一个单线程程序.只是由于这种设计,重定向才适用于[`ShellExecuteEx`](https://msdn.microsoft.com/en-us/library/bb759784)(仅适用于控制台程序,如上所述),因为GUI shell API否则不支持标准I/O. (2认同)

ber*_*nie 165

如果您不希望在运行程序时弹出终端窗口pythonw.exe;
否则,请使用python.exe

关于语法错误:print 现在是3.x中的函数
所以请改用:

print("a")
Run Code Online (Sandbox Code Playgroud)


jon*_*jon 18

见这里:http: //docs.python.org/using/windows.html

pythonw.exe"这会在启动时禁止终端窗口."

  • `pythonw.exe`有副作用,如果你的程序写入stdout/stderr流你的程序可能会失败 - 请参阅http://bugs.python.org/issue706263 (7认同)

Dro*_*ans 16

如果您要从其他进程(例如,从命令行)调用python脚本,请使用pythonw.exe.否则,您的用户将不断看到cmd启动python进程的窗口.它仍然会以相同的方式运行您的脚本,但它不会干扰用户体验.

一个例子可能是发送电子邮件; python.exe将弹出CLI窗口,发送电子邮件,然后关闭窗口.它看起来像一个快速闪光灯,可以被认为有点烦人.pythonw.exe避免这种情况,但仍然发送电子邮件.

  • 没错,但重新"说,从命令行":如果你已经*在控制台(终端)窗口*,那么`python.exe`将_not_打开另一个. (5认同)