如何阻止Python程序可执行文件打开cmd窗口?
我正在制作一个应用程序,使用Python的socket
库在局域网中传输数据。负责这部分的代码有自己的可执行文件。但是当我运行它时,桌面上会弹出一个命令窗口。
我该如何在不弹出命令窗口的情况下运行这段代码呢?
具体情况:
这个程序只处理网络通信,没有理由让命令窗口弹出来(我在代码中从来没有使用过print()
等)。有没有什么方法可以阻止这个命令窗口显示,而我却不知道呢?这个网络程序需要和其他部分分开,以便用户在必要时可以自己调用它。
这个程序是通过cx_Freeze从Python转换成Windows可执行文件的,可能这也有关系。
2 个回答
由@Kyllopardium提交的这个回答可能正是你需要的。如果你不打算使用控制台界面,就没有必要创建一个控制台应用程序。
不过,考虑到这个网络程序还需要作为独立应用运行,你可能需要为控制台界面单独构建一个可执行文件。如果你希望只有一个控制台程序,可以使用子进程模块,在从主应用启动时隐藏控制台窗口。
你可以配置一个STARTUPINFO
实例来隐藏应用窗口,并将其传递给Popen
构造函数。你也可以将这个参数传递给子进程的便利函数,比如call
、check_call
和check_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会为子进程创建一个新的控制台。
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.
它们基本上做的是一样的事情。