我有一个用Python编写的脚本,运行着一个Tkinter GUI,其中包含一个按钮小部件,调用一个用C语言编写的可执行文件。但是,每当我点击该按钮时,一个控制台窗口会弹出来,并在执行完毕后关闭。我使用以下命令调用可执行文件:
import subprocess
subprocess.call[args]
如何隐藏该弹出窗口?因为我正在使用GUI,如果控制台无处弹出,这不太好看。
使用 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
标志会更好。 - user2371524NUL
(即 subprocess.DEVNULL
)。如果您保留标准句柄未设置,则某些程序可能会崩溃,因为它们假定对于控制台应用程序,标准句柄始终被定义。 - Eryk Sun
CreateProcess()
,传递DETACHED_PROCESS
创建标志以避免它。 - user2371524CreateProcess()
,但其他人可能会知道。顺便说一句,使用哪种语言编译“本地”可执行文件确实无关紧要。 - user2371524