深度学习模型数据集相对路径配置及PyInstaller路径错误排查
解决PyInstaller打包后数据集路径错误问题
问题背景
我开发了一个深度学习模型,Images数据集文件夹和Python脚本都放在FINAL目录里。现在要通过PyInstaller(用Auto-py-to-exe)把.py脚本转成Windows可执行文件,再用NSIS做安装程序。除了路径错误,其他功能都正常。
当前代码用了硬编码的绝对路径,导致只有我自己的电脑能运行,其他用户得改路径重新打包才行。我试了用sys._MEIPASS写的resource_path函数,但没起作用,现在报找不到路径的错。
当前代码
def resource_path(relative_path): #Installs relative path over hard-coded path for EXE file to work """ Get absolute path to resource, works for PyInstaller """ try: # PyInstaller creates a temp folder and stores path in _MEIPASS base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) model=1 path= resource_path(r'C:\Users\Nitin_Sethi-PC\Desktop\PS-I\FINAL\Images')
报错信息
Traceback(most recent call last): File "guifinal-exe.py", line 105, in <module> File "guifinal-exe.py", line 57 in load_images_from_folder FileNotFoundError: [WinError 3] The system cannot find the path specified: 'C:\\Users\\Nitin_Sethi-PC\\Desktop\\PS-I\\FINAL\\Images\\Benign' [8112] Failed to execute script 'guifinal-exe' due to unhandled exception!
解决方案
1. 修正相对路径的使用
你现在核心问题是把绝对路径传给了resource_path函数,这完全浪费了这个函数的作用。resource_path本来就是用来接收相对路径,自动拼接成正确的绝对路径(不管是开发环境还是打包后的临时目录)。
把路径改成纯相对路径,直接传'Images'就行,因为脚本和Images在同一个FINAL目录下:
path = resource_path('Images')
2. 让PyInstaller打包时带上Images文件夹
光改代码没用,PyInstaller默认不会自动打包你的数据集文件夹,必须明确告诉它要包含这个目录:
- 如果用Auto-py-to-exe:找到"Additional Files"选项,点击"Add Folder"选你的
Images文件夹,目标路径设为./Images(或者直接留空,默认会放到EXE的根目录)。 - 如果用命令行PyInstaller:加
--add-data参数,比如:
pyinstaller --onefile --add-data "Images;./Images" guifinal-exe.py
(Windows下用分号分隔源和目标,Linux/macOS用冒号)
3. 确认路径逻辑
修改后,resource_path函数会在两种场景下正常工作:
- 开发阶段:
base_path是当前脚本所在的FINAL目录,拼接'Images'后就是正确的数据集路径。 - 打包后运行:PyInstaller会把Images文件夹解压到临时目录,
sys._MEIPASS指向这个临时目录,拼接后就能找到数据集。
4. NSIS安装程序的注意事项
用NSIS做安装程序时,要确保安装过程中把Images文件夹和EXE文件放到同一个目录下。这样用户安装后,EXE运行时会自动在当前目录找到Images,不用额外配置。
测试步骤
- 改完代码先在本地跑一遍,确认路径正确,模型能加载Images里的文件。
- 用Auto-py-to-exe或命令行重新打包,确保Images被包含进去。
- 把生成的EXE放到其他电脑或者自己换个目录测试,确认不会再报路径错误。
- 用NSIS制作安装程序时,把EXE和Images文件夹都设为安装文件,指定它们安装到同一个目录。
内容的提问来源于stack exchange,提问作者Chaitanya Sethi
相关产品推荐
相关产品推荐

