有没有任何方法可以在没有命令外壳的情况下运行Python脚本? 使用“.pyw”扩展命名我的文件不起作用。如何在没有Windows控制台出现的情况下运行Python脚本
编辑:()用的ShellExecute解决的问题
有没有任何方法可以在没有命令外壳的情况下运行Python脚本? 使用“.pyw”扩展命名我的文件不起作用。如何在没有Windows控制台出现的情况下运行Python脚本
编辑:()用的ShellExecute解决的问题
使用ShellExecuteEx函数。
BOOL ShellExecuteEx(
_Inout_ SHELLEXECUTEINFO *pExecInfo
);
这是pExecInfo: *** n显示 - 标志指定的应用程序是如何显示,当它打开时
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;
尝试使用Python的pythonw.exe
可执行文件来启动你的脚本。
在Windows操作系统,可执行文件是控制台应用程序(python.exe
与出w
是一个控制台应用程序)的运行表示控制台窗口;另一方面,常规Windows应用程序不会产生黑色控制台窗口。
你可以找到关于这两个可执行文件的细节在这个古老的问题:pythonw.exe or python.exe?
以及有关Windows不同类型的应用程序在这里:Difference between Windows and Console application
从另一个帖子此信息可以帮助:https://stackoverflow.com/a/30313091/6470259
python.exe
是一个控制台(终端)应用程序在上启动CLI型脚本。 *除非从现有控制台窗口运行,否则将打开一个新的控制台窗口,其中python.exe
。 * 标准流sys.stdin
,sys.stdout
和sys.stderr
被连接到 控制台窗口。 *执行是同步:
- 如果创建一个新的控制台窗口,它一直开到脚本终止。
- 从现有控制台窗口调用时,提示将被阻止,直到脚本终止。
pythonw.exe
是推出一个GUI应用程序GUI /无UI不惜一切脚本。 * NO控制台窗口已打开。 *执行是 异步:
- 当从一个控制台窗口调用脚本仅仅是推出和提示立即返回,脚本是否仍在运行与否。 * 标准流
sys.stdin
,sys.stdout
和sys.stderr
是不可用。- 注意:除非你采取额外的步骤,这有可能意想不到的副作用:
- 未处理的异常导致脚本中止默默。
- 在Python 2.x中,简单地尝试使用
print()
会导致发生这种情况(在3.x中,print()
根本没有效果)。
- 要防止从脚本,并了解更多内,看到 矿this answer。
- 特设,可以使用输出重定向:谢谢,@handle。
pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
(来自PowerShell:cmd /c pythonw.exe yourScript.pyw 1>stdout.txt 2>stderr.txt
)捕获 标准输出和标准输出文件。如果您确信使用的print()
是你的脚本pythonw.exe
静静地失败的唯一原因,而你不感兴趣的标准输出输出,使用 @手柄的命令,从评论:pythonw.exe yourScript.pyw 1>NUL 2>&1
买者:该输出重定向技术貌似不是调用时工作*.pyw
脚本直接(而不是 将脚本文件路径传递给pythonw.exe
)。 如果您知道为什么和/或它是否适合您,请告诉我是否 。您可以将可执行文件的通过 默认运行脚本控制 - 通过选择 正确的文件扩展名 - 例如从资源管理器打开时,如:
*.py
文件默认关联(引用)与python.exe
*.pyw
文件默认关联(引用)与pythonw.exe
无耻抄袭[这里](http://stackoverflow.com/a/30313091/1222951)。 –
在所有的Python安装,因为2.5(甚至更早),如果安装已处理得当,.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
如果你没有,你可以采取一些措施来解决这个问题:
如果您不是机器的管理员,则可以将.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 \ Classes'或'HKCU \ Software \ Classes'。 HKCR虚拟键是这两棵树的合并视图,因此修改它的结果取决于当前定义的键。合并使用'HKCR'的.reg文件可能会修改'HKCU'中的子密钥(如果存在),否则将修改'HKLM'中的子密钥(如果存在),否则在'HKLM'中创建子密钥。因此,密钥及其子密钥最终可能会部分为当前用户定义,并部分为本地计算机定义。 – eryksun
请注意,cmd的'assoc'和'ftype'命令仅显示和修改'HKLM \ Software \ Classes'键,这些键仅为用户在资源管理器中的选择定义了一种可能性。还有其他地方可以定义文件关联,例如'[HKCU | HKLM] \ Software \ Classes \ Applications'以及'[HKCU | HKLM] \ Software \ Classes \ SystemFileAssociations'下的默认值。用户当前的选择位于HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts中,但只能使用GUI对其进行修改。 – eryksun
谢谢,现在我从C运行像巨蟒文件这个:system(“python.pyw”)。我应该如何执行它? – David
@David,'system'使用cmd来运行程序,当您从非控制台程序运行非控制台程序时,该程序会短暂地闪烁控制台。如果你没有传递参数给脚本,你可以使用'os.startfile(“script.pyw”)'。但首先修复.pyw文件关联。 '[HKLM | HKCU] \ Software \ Classes \ .pyw'的默认值应该是'Python.NoConFile'。然后使用右键单击“打开方式”对话框选择始终使用Python for .pyw脚本。如果有多个Python条目,请全部尝试,直到它正常工作,但*不*“在此PC上查找另一个应用程序”。 – eryksun