如何解决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
相关产品推荐
相关产品推荐

