You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法通过launcher.py从PyInstaller包启动主Python脚本Ex.py

解决PyInstaller打包后launcher.py无法定位Ex.py的问题

问题分析

你遇到的错误根源在于:PyInstaller打包后,所有脚本和资源文件会被解压到临时目录(由sys._MEIPASS指向),而非可执行文件所在的用户目录。之前的代码用sys.argv[0]获取的是可执行文件的路径,自然找不到包内的Ex.py;如果之前尝试sys._MEIPASS无效,大概率是打包时没把Ex.py作为数据文件包含进包内。


解决方案步骤

1. 打包时正确包含Ex.py

使用PyInstaller打包时,必须通过--add-data参数将Ex.py加入打包列表,确保它会被提取到运行时临时目录:

  • Windows系统:
pyinstaller --onefile --add-data "Ex.py;." launcher.py
  • Linux/Mac系统:
pyinstaller --onefile --add-data "Ex.py:." launcher.py

--add-data的格式是源文件;目标目录(Windows用分号,类Unix用冒号),这里的.表示将Ex.py提取到临时目录的根路径。

2. 修改launcher.py的路径逻辑与执行方式

不需要用subprocess调用外部Python解释器,直接在当前Python环境中执行Ex.py的代码即可,修正后的代码如下:

import sys
import os

def launch_script():
    try:
        # 获取PyInstaller运行时临时目录,未打包时 fallback到脚本所在目录
        base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(sys.argv[0])))
        
        # 构建Ex.py的完整路径
        ex_script_path = os.path.join(base_path, 'Ex.py')
        
        # 读取并执行Ex.py的代码
        with open(ex_script_path, 'r', encoding='utf-8') as f:
            code_content = f.read()
            compile(code_content, ex_script_path, 'exec')
            exec(code_content)
            
    except Exception as e:
        print(f"Error launching script: {e}")

if __name__ == '__main__':
    launch_script()

关键说明

  • sys._MEIPASS:PyInstaller打包后的可执行文件运行时,会自动设置这个变量,指向临时解压目录的路径,所有打包的资源文件都在这里。
  • 直接执行代码:避免了调用外部Python解释器的开销,同时适配打包后的封闭环境——sys.executable在打包后指向的是内置Python运行时,无法直接访问解压后的Ex.py路径。
  • 兼容未打包状态:getattr(sys, '_MEIPASS', ...)的写法可以让脚本在未打包时也正常运行,此时会使用脚本所在目录作为路径。

内容的提问来源于stack exchange,提问作者DGL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:04:53