如何阻止Python程序可执行文件打开cmd窗口?

3 投票
2 回答
2239 浏览
提问于 2025-04-18 07:53

我正在制作一个应用程序,使用Python的socket库在局域网中传输数据。负责这部分的代码有自己的可执行文件。但是当我运行它时,桌面上会弹出一个命令窗口。

我该如何在不弹出命令窗口的情况下运行这段代码呢?

具体情况: 这个程序只处理网络通信,没有理由让命令窗口弹出来(我在代码中从来没有使用过print()等)。有没有什么方法可以阻止这个命令窗口显示,而我却不知道呢?这个网络程序需要和其他部分分开,以便用户在必要时可以自己调用它。

这个程序是通过cx_Freeze从Python转换成Windows可执行文件的,可能这也有关系。

2 个回答

1

由@Kyllopardium提交的这个回答可能正是你需要的。如果你不打算使用控制台界面,就没有必要创建一个控制台应用程序。

不过,考虑到这个网络程序还需要作为独立应用运行,你可能需要为控制台界面单独构建一个可执行文件。如果你希望只有一个控制台程序,可以使用子进程模块,在从主应用启动时隐藏控制台窗口。

你可以配置一个STARTUPINFO实例来隐藏应用窗口,并将其传递给Popen构造函数。你也可以将这个参数传递给子进程的便利函数,比如callcheck_callcheck_output。例如:

import subprocess

exe = r'\path\to\networking_program.exe'
args = [exe, 'param1', '...', 'paramN']

if hasattr(subprocess, 'STARTUPINFO'):
# Windows
    si = subprocess.STARTUPINFO()
    si.dwFlags |= subprocess.STARTF_USESHOWWINDOW   
    # The following is the initialized default, but
    # setting it explicitly is self-documenting.
    si.wShowWindow = subprocess.SW_HIDE 
else: 
# POSIX
    si = None  

try:    
    subprocess.check_call(args, startupinfo=si)
    # check_call waits for the process to exit.
    # If the return code is non-zero it raises the 
    # following exception:
except subprocess.CalledProcessError as e:
    handle_error(e)

需要注意的是,程序是直接运行的,而不是通过cmd.exe命令行窗口来运行。因此,隐藏的窗口是程序自己的控制台窗口,而不是“cmd命令行”窗口。这个窗口是在一个单独的进程中运行的(例如在Windows 7及以上版本中是conhost.exe)。多个应用程序可以共享同一个控制台,比如当一个父进程(例如python.exe)启动一个子进程并等待它退出时。如果父进程没有控制台(例如pythonw.exe),那么Windows会为子进程创建一个新的控制台。

0
from cx_Freeze import main
sys.argv = [sys.argv[0], '--target-dir', '%s'%DISTFOLDER, '--base', 'Win32GUI', entrypoint ]
main()

你需要把你想要的目标文件夹放在DISTFOLDER的位置,把你的入口脚本放在entrypoint的位置。

不显示控制台的部分其实很简单,只需要加上 –base Win32GUI 这个标签就行。

或者:

import sys
from cx_Freeze import setup, Executable

base = None
if (sys.platform == "win32"):
    base = "Win32GUI"    # Tells the build script to hide the console.

它们基本上做的是一样的事情。

撰写回答