如何在Python中运行可执行文件而不弹出可执行文件的控制台?

4

我有一个用Python编写的脚本,运行着一个Tkinter GUI,其中包含一个按钮小部件,调用一个用C语言编写的可执行文件。但是,每当我点击该按钮时,一个控制台窗口会弹出来,并在执行完毕后关闭。我使用以下命令调用可执行文件:

import subprocess    
subprocess.call[args]

如何隐藏该弹出窗口?因为我正在使用GUI,如果控制台无处弹出,这不太好看。


并不存在所谓的“C可执行文件”。如果你指的是最初用C编写并现在已经编译的可执行文件,那么它是用C编写的这一事实与手头的问题无关紧要。 - Federico klez Culloca
我猜这是在Windows上?那么这是win32的限制...应用程序要么标记为“gui”,要么标记为“console”,对于后者,默认情况下会附加一个新控制台,如果没有已经存在的控制台。您可以自己调用CreateProcess(),传递DETACHED_PROCESS创建标志以避免它。 - user2371524
@FedericoklezCulloca 哦,我不知道那个*.exe文件的名称。所以,我把它命名为C可执行文件。但是,是的,我的意思是用C编写并编译的可执行文件。 - fahadh4ilyas
如果我的假设是正确的--请添加一个windows或winapi标签。我不知道如何从python中调用CreateProcess(),但其他人可能会知道。顺便说一句,使用哪种语言编译“本地”可执行文件确实无关紧要。 - user2371524
1
如果不是重复的话,请参考此链接:https://dev59.com/CWw05IYBdhLWcg3w0VKa - alk
显示剩余3条评论
1个回答

3

使用 subprocess.Popen() startupinfo 参数。

startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = subprocess.SW_HIDE
subprocess.Popen(command, startupinfo=startupinfo)

如果你想向进程传递参数,你应该将它作为数组传递给popen函数:

subprocess.Popen(['program.exe','arg1','arg2'], startupinfo=startupinfo)

编辑:
正如Felix在评论中指出的那样,如果您想让子进程完全没有控制台,则应使用DETACHED_PROCESS标志和subprocess.call

MSDN页面所述:

DETACHED_PROCESS 0x00000008 - 对于控制台进程,新进程不会继承其父进程的控制台(默认情况下)。 新进程可以随后调用AllocConsole函数来创建控制台。有关详细信息,请参阅创建控制台。该值不能与CREATE_NEW_CONSOLE一起使用。

DETACHED_PROCESS = 0x00000008
subprocess.call('program.exe', creationflags=DETACHED_PROCESS)

好的,这将隐藏控制台窗口。很有可能被调用的程序甚至不需要一个控制台,在这种情况下,使用DETACHED_PROCESS标志会更好。 - user2371524
1
哦,不好意思。我使用同一变量来显示弹出窗口,所以它没有工作。但是现在它完美地工作了。谢谢。 - fahadh4ilyas
当然,没问题 :) - Megabeets
创建独立进程时,如果未设置到管道,则通常最可靠的方法是将标准句柄设置为 NUL(即 subprocess.DEVNULL)。如果您保留标准句柄未设置,则某些程序可能会崩溃,因为它们假定对于控制台应用程序,标准句柄始终被定义。 - Eryk Sun

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