如何在不显示Windows控制台的情况下运行Python脚本

4
有没有办法在没有命令行窗口瞬间出现的情况下运行Python脚本? 使用".pyw"扩展名命名文件不起作用。
4个回答

6

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

在Windows操作系统中,控制台应用程序(没有wpython.exe是一个控制台应用程序)会显示控制台窗口;而常规的Windows应用程序则不会生成黑色控制台窗口。

您可以在这个旧问题中找到有关这两个可执行文件的详细信息:pythonw.exe或python.exe?

关于Windows不同类型的应用程序,请参阅这里:Windows和控制台应用程序之间的区别


谢谢,现在我正在使用C语言运行Python文件,代码如下:system("python.pyw")。那么现在我该如何执行它呢? - David
1
@David,system使用cmd来运行程序,当你从非控制台程序运行非控制台程序时,它会短暂地闪现一个控制台。如果你没有向脚本传递参数,可以使用os.startfile("script.pyw")代替。但首先要修复.pyw文件关联。默认值为[HKLM|HKCU]\Software\Classes\.pyw应该是Python.NoConFile。然后使用右键“打开方式”对话框选择始终使用Python来处理.pyw脚本。如果有多个Python条目,请尝试所有条目,直到正确工作,但不要“在此计算机上查找其他应用程序”。 - Eryk Sun

2
在所有Python 2.5及以上版本的安装中(可能在早期版本中也是如此),如果安装正确,.py文件将与python.exe相关联,而.pyw文件将与pythonw.exe相关联。
如果关联已被篡改或针对特定用户进行了覆盖,则可能会有所不同。
在命令提示符中运行以下命令:
ftype | find "pythonw"
assoc | find ".pyw"

我得到:

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

如果您没有安装Python,您可以采取以下几个步骤来解决问题:
  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\" %*"


最好修改 HKLM\Software\ClassesHKCU\Software\ClassesHKCR 虚拟键是这两个树的合并视图,因此修改它的结果取决于当前定义的键。合并使用 HKCR 的 .reg 文件可能会修改 HKCU 中的子键(如果存在),否则会修改 HKLM 中的子键(如果存在),否则会在 HKLM 中创建子键。因此,一个键及其子键可能会部分地为当前用户定义,部分地为本地机器定义。 - Eryk Sun
请注意,cmd的“assoc”和“ftype”命令仅显示和修改“HKLM \ Software \ Classes”键,并且这些键仅为用户在资源管理器中选择定义了一种可能性。文件关联可以在其他位置定义,例如“[HKCU | HKLM] \ Software \ Classes \ Applications”和“[HKCU | HKLM] \ Software \ Classes \ SystemFileAssociations”下的默认值。用户当前的选择位于“HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts”,但是应该只能使用GUI进行修改。 - Eryk Sun

0
简单的方法是将 "LazyLibrarian.py" 复制为 "LazyLibraryian.pyw",并在桌面上创建一个快捷方式。然后将该快捷方式放入您的启动文件夹中。

0

使用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;

你能详细说明一下你是怎么到达那里的吗?谢谢! - CheetSheatOverlode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接