How to stop a python program executable from opening a cmd shell?
我正在创建一个使用Python的
如何在没有shell弹出的情况下运行此代码?
细节:
该程序只处理网络; 没有理由弹出shell(我从不在代码中使用
程序通过cx_Freeze从python转换为windows可执行文件
@Kyllopardium提交的答案可能正是您所需要的。如果您从未打算使用控制台界面,则没有理由创建控制台应用程序。
也就是说,鉴于网络程序也需要作为独立应用程序运行,您可能需要为控制台界面构建单独的可执行文件。如果您希望拥有单个控制台程序,则可以使用子进程模块在从主应用程序启动时隐藏控制台窗口。
配置
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和入口点的入口点脚本放入目标目录。
无控制台部分就像
要么:
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. |
它们几乎完全相同。