【问题标题】:How to Run Executable in Python Without Pop Up Console of The Executable? [duplicate]如何在不弹出可执行文件控制台的情况下在 Python 中运行可执行文件? [复制]
【发布时间】:2018-01-22 01:26:36
【问题描述】:

所以,我有一个运行 Tkinter GUI 的 python 脚本,它有一个按钮小部件,该小部件调用用 C 编写的可执行文件。但是,每次我单击该按钮时,都会弹出一个运行该 C 可执行文件的控制台,然后在之后关闭运行完毕。我使用

调用可执行文件
import subprocess    
subprocess.call[args]

如何隐藏该弹出窗口?因为我使用的是 GUI,如果控制台无处弹出,那就有点不好了。

【问题讨论】:

  • 没有“C 可执行文件”这样的东西。如果您的意思是最初用 C 编写并现在编译的可执行文件,那么它是用 C 编写的这一事实与手头的问题无关。
  • 我猜这是在 Windows 上?然后这是 win32 的限制...应用程序标记为guiconsole,对于后者,如果还没有一个新控制台,则默认附加一个新控制台。您可以自己调用CreateProcess(),传递DETACHED_PROCESS 创建标志来避免它。
  • @FedericoklezCulloca 哦,我不知道那个 *.exe 文件的名称。因此,我将其命名为 C 可执行文件。但是,是的,这就是我的意思,用 C 语言编写的可执行文件,经过编译。
  • @fahadh4ilyas 如果我的假设是正确的——添加一个 windows 或 winapi 标签。我不知道如何从 python 调用CreateProcess(),但其他人可能知道。顺便说一句,使用哪种语言编译“本机”可执行文件确实无关紧要。
  • 如果不重复,相关:stackoverflow.com/q/7006238/694576

标签: python windows console


【解决方案1】:

使用subprocess.Popen()classstartupinfo参数。

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 在 cmets 中指出的那样,如果您希望孩子根本没有控制台,您应该使用 DETACHED_PROCESS 标志和 subprocess.call

this MSDN 页面所述:

DETACHED_PROCESS 0x00000008 - 对于控制台进程,新进程不会继承其父进程 控制台(默认)。新进程可以调用 AllocConsole 稍后运行以创建控制台。了解更多信息, 请参阅创建控制台。此值不能与 CREATE_NEW_CONSOLE。

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

【讨论】:

  • 好的,这将隐藏控制台窗口。很有可能被调用的程序甚至需要控制台,在这种情况下,使用DETACHED_PROCESS 标志会更好。
  • 哦,没关系。我使用相同的变量来显示弹出窗口,这就是它不起作用的原因。但是,现在它工作得很好。谢谢。
  • 当然,没问题:)
  • 创建分离进程时,如果没有设置为管道,通常将标准句柄设置为NUL(即subprocess.DEVNULL)是最可靠的。如果您未设置标准句柄,某些程序可能会崩溃,因为它们假定它始终是为控制台应用程序定义的。
猜你喜欢
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
相关资源
最近更新 更多