PySimpleGUI脚本打包exe后subprocess.Popen子进程重复创建求助
解决PySimpleGUI打包exe后重复创建子进程的问题
问题根源
打包成exe后,sys.executable指向的是当前打包好的主程序exe,而非Python解释器。你原来的代码subprocess.Popen([sys.executable, "sele.py"])会每次点击按钮都启动主程序本身,进而导致重复创建子进程。
解决方案
方案1:将sele.py单独打包为exe直接调用
- 用PyInstaller把
sele.py打包成独立exe:pyinstaller --onefile sele.py - 主程序中修改调用代码:
elif event == 'web': # 确保sele.exe和主exe在同一目录,或指定完整路径 subprocess.Popen("sele.exe", shell=True)
方案2:主程序打包时包含sele.py并修正路径
如果不想单独打包sele.py,需让主程序打包时包含该文件,并在运行时获取正确路径:
- 打包主程序时执行命令(Windows用
;分隔,Mac/Linux用:):pyinstaller --onefile --add-data "sele.py;." your_main_script.py - 主程序中添加路径处理逻辑并修改调用代码:
import sys import os import subprocess import PySimpleGUI as sg def get_resource_path(relative_path): # 适配打包后的文件路径 try: base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) # ... 其他GUI代码 ... elif event == 'web': sele_path = get_resource_path("sele.py") # 非打包环境用sys.executable,打包后直接调用系统python解释器 python_cmd = sys.executable if not getattr(sys, 'frozen', False) else 'python' subprocess.Popen([python_cmd, sele_path])
方案3:结合多线程+路径修正(避免GUI阻塞)
如果之前试过多线程无效,大概率是路径没处理对,结合路径修正的多线程写法:
import threading def run_sele(): sele_path = get_resource_path("sele.py") python_cmd = sys.executable if not getattr(sys, 'frozen', False) else 'python' subprocess.Popen([python_cmd, sele_path]) # ... GUI代码 ... elif event == 'web': threading.Thread(target=run_sele, daemon=True).start()
用线程启动既不会阻塞GUI,也能解决路径导致的重复进程问题。
注意事项
- 打包时确认sele.py被正确包含,或sele.exe与主exe在同一目录
- 若sele.py依赖第三方库(如selenium),打包时需确保这些库被正确打包
- 可在sele.py开头加
print("sele.py已启动"),通过控制台输出验证是否解决重复进程问题
内容的提问来源于stack exchange,提问作者Muhammad Hussnain
相关产品推荐
相关产品推荐

