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

如何解决Linux下PyInstaller打包Python独立脚本时找不到依赖文件的问题

解决PyInstaller打包时找不到other_script.py的问题

这个问题我碰到过好多次,核心原因有两个:一是Python 3已经移除了execfile()函数,二是PyInstaller不会自动识别你通过exec加载的脚本,而且打包后程序的运行路径逻辑和直接跑脚本时不一样。下面给你一步步的解决方案:

1. 替换execfile为Python 3兼容写法

首先把你原来的execfile('other_script.py')替换成Python 3支持的代码,比如:

with open('other_script.py', 'r') as f:
    exec(f.read())

不过这只是第一步,还得处理路径和打包的问题。

2. 告诉PyInstaller打包时包含other_script.py

PyInstaller默认只会打包主脚本和它import的模块,像你用exec加载的文件不会被自动包含,所以打包时需要用--add-data参数指定要包含的文件。在Linux终端执行打包命令:

pyinstaller --add-data "other_script.py:." main.py

这里的:是Linux下的路径分隔符(Windows用;),.表示把other_script.py放到和打包后的主程序相同的目录下。

3. 处理打包后的运行路径问题

打包后,程序运行时的当前工作目录可能不是程序本身所在的目录,所以得先获取程序的实际路径,再拼接other_script.py的路径。把你的代码改成这样:

import os
import sys

def get_resource_path(relative_path):
    # 处理PyInstaller打包后的特殊路径
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    # 非打包状态下的正常路径
    return os.path.join(os.path.abspath("."), relative_path)

# 加载并执行other_script.py
script_path = get_resource_path('other_script.py')
with open(script_path, 'r') as f:
    exec(f.read())

sys._MEIPASS是PyInstaller打包后临时解压资源的目录,这个函数能自动适配打包和非打包两种场景。

4. 更稳妥的替代方案:改用import导入

如果other_script.py本身可以作为一个模块使用(比如里面没有直接执行的代码,都是函数/类定义),那直接用import会更省心,PyInstaller会自动识别并打包它:

import other_script

这样就不用额外加--add-data参数,路径问题也不用手动处理,是更规范的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:39:36