如何在没有Windows控制台的情况下运行Python脚本

有什么方法可以运行一个Python脚本,而不会立即出现一个命令shell? 用“.pyw”扩展命名我的文件不起作用。

编辑:问题用ShellExecute()解决

尝试使用Python的pythonw.exe可执行文件来启动您的脚本。

在Windows操作系统中,作为控制台应用程序的可执行文件(带有w python.exe是一个控制台应用程序)正在运行,显示一个控制台窗口; 另一方面,常规的Windows应用程序不会产生黑色的控制台窗口。

你可以在这个老问题中找到关于这两个可执行文件的细节: pythonw.exe或者python.exe?

还有关于Windows不同类型的应用程序: Windows和控制台应用程序之间的区别

在2.5(以及更早版本)之后的所有python安装中,如果安装已经正确完成, .py文件与python.exe相关联, .pyw文件与pythonw.exe相关联

如果这些关联已经被篡改或者被某个用户覆盖,那么这个关联可能会有所不同。

在cmd中运行以下命令:

 ftype | find "pythonw" assoc | find ".pyw" 

我得到:

  Python.NoConFile="D:\Program Files\Python27\pythonw.exe" "%1" %* .pyw=Python.NoConFile 

如果你没有这个,你可以做几件事来解决这个问题:

  1. 重新安装/修复python安装(运行安装程序,它会建议修复安装)
  2. 如果您不是机器的管理员,则可以将.pyw文件关联到pythonw.exe 。 小问题,你必须改变注册表键后添加额外的参数或删除一个参数.pyw文件不会考虑到(这是很少使用,但仍然)

    [HKEY_CLASSES_ROOT\Python.NoConFile\shell\open\command] @="\"L:\\Portable_Python_2.7.3.1\\App\\pythonw.exe\" \"%1\" %*"

使用ShellExecuteEx函数。

 BOOL ShellExecuteEx( _Inout_ SHELLEXECUTEINFO *pExecInfo ); 

这是pExecInfo:*** nShow – 指定应用程序在打开时如何显示的标志

 typedef struct _SHELLEXECUTEINFO { DWORD cbSize; ULONG fMask; HWND hwnd; LPCTSTR lpVerb; LPCTSTR lpFile; LPCTSTR lpParameters; LPCTSTR lpDirectory; int nShow;/*=0 if you don't want the console window to appear*/ HINSTANCE hInstApp; LPVOID lpIDList; LPCTSTR lpClass; HKEY hkeyClass; DWORD dwHotKey; union { HANDLE hIcon; HANDLE hMonitor; } DUMMYUNIONNAME; HANDLE hProcess; } SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO; 

来自另一篇文章的信息可能有所帮助: https : //stackoverflow.com/a/30313091/6470259

  • python.exe用于启动CLI类型脚本的控制台(终端)应用程序。 *除非从现有的控制台窗口运行,否则python.exe 打开一个新的控制台窗口 。 * 标准流 sys.stdinsys.stdoutsys.stderr 连接到控制台窗口 。 *执行是同步的

    • 如果创建了一个新的控制台窗口,它将保持打开状态,直到脚本终止。
    • 从现有控制台窗口调用时,提示将被阻止,直到脚本终止。
  • pythonw.exe是一个GUI应用程序启动GUI /无UI的所有脚本 。 * 没有控制台窗口打开。 *执行是异步的

    • 从控制台窗口调用时,脚本仅启动,并立即返回,不管脚本是否仍在运行。 * 标准流 sys.stdinsys.stdoutsys.stderr 不可用
    • 警告除非您采取额外步骤否则 可能会产生意想不到的副作用
      • 未处理的异常会导致脚本无声地中止
      • 在Python 2.x中,简单地使用print()会导致这种情况发生 (在3.x中, print()根本没有效果)。
        • 为了防止在你的脚本中 ,并了解更多,请参阅我的这个答案 。
        • 特别的 ,你可以使用输出重定向谢谢,@ 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静默失败的唯一原因,并且您对stdout输出不感兴趣,请使用以下注释中的@ handle命令: pythonw.exe yourScript.pyw 1>NUL 2>&1
          注意 :当直接调用*.pyw脚本时,这种输出重定向技术看起来不起作用(而不是通过将脚本文件路径传递给pythonw.exe )。 如果你知道为什么和/或它是否适合你,请告诉我。

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

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