如何阻止python程序可执行文件打开cmd shell?

How to stop a python program executable from opening a cmd shell?

我正在创建一个使用Python的socket库通过LAN传输数据的应用程序。 负责此的代码有自己的可执行文件。 但是当它被称为命令窗口显示在桌面上时。

如何在没有shell弹出的情况下运行此代码?

细节:
该程序只处理网络; 没有理由弹出shell(我从不在代码中使用print()等)。 有没有办法阻止shell显示,我不知道? 网络程序需要与程序的其余部分保持独立,以便在必要时用户可以自己调用它。

程序通过cx_Freeze从python转换为windows可执行文件
cx_Freeze,如果有意义)


@Kyllopardium提交的答案可能正是您所需要的。如果您从未打算使用控制台界面,则没有理由创建控制台应用程序。

也就是说,鉴于网络程序也需要作为独立应用程序运行,您可能需要为控制台界面构建单独的可执行文件。如果您希望拥有单个控制台程序,则可以使用子进程模块在从主应用程序启动时隐藏控制台窗口。

配置STARTUPINFO的实例以隐藏应用程序窗口并将其传递给Popen构造函数。您还可以将此参数传递给子流程便捷函数callcheck_callcheck_output。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import subprocess

exe = r'\path\to
etworking_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 shell运行。因此隐藏的窗口是程序自己的控制台窗口,而不是"cmd shell"窗口。此窗口托管在单独的进程中(例如Windows 7+中的conhost.exe)。多个应用程序可以共享同一个控制台,例如父进程(例如python.exe)启动子进程并等待它退出时。如果父进程没有控制台(例如pythonw.exe),则Windows会为该子进程创建一个新控制台。


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

您需要为DISTFOLDER和入口点的入口点脚本放入目标目录。

无控制台部分就像–base Win32GUI标签一样简单。

要么:

1
2
3
4
5
6
import sys
from cx_Freeze import setup, Executable

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

它们几乎完全相同。