猿问

用PyInstaller捆绑数据文件(-onefile)

用PyInstaller捆绑数据文件(-onefile)

我试图用PyInstaller构建一个文件EXE,它包括一个图像和一个图标。我不能为了我的一生让它和我一起工作--onefile.

如果我做了--onedir一切都很好。当我用--onefile,它无法找到引用的附加文件(在运行已编译的EXE时)。它发现DLL和其他一切都很好,只是找不到这两个图像。

我查看了运行EXE时生成的temp-dir(\Temp\_MEI95642\)并且文件确实在那里。当我把EXE放在临时目录中时,它会找到它们。非常令人困惑。

这就是我添加到.spec档案

a.datas += [('images/icon.ico', 'D:\\[workspace]\\App\\src\\images\\icon.ico',  'DATA')
,('images/loaderani.gif','D:\\[workspace]\\App\\src\\images\\loaderani.gif','DATA')]

我应该补充说,我已经尝试过没有把他们也放在子文件夹,没有什么区别。

编辑: 由于PyInstaller更新,将较新的答案标记为正确。


POPMUISE
浏览 1115回答 3
3回答

MMTTMM

更新版本的PyInstaller不设置env变了,所以Shish很棒回答不会起作用的。现在,路径被设置为sys._MEIPASS:def resource_path(relative_path):     """ Get absolute path to resource, works for dev and 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)

MMMHUHU

pyinstaller将数据解压缩到一个临时文件夹中,并将此目录路径存储在_MEIPASS2环境变量为了得到_MEIPASS2在压缩模式下使用dir,并在解压缩(开发)模式下使用本地目录,我使用如下:def resource_path(relative):     return os.path.join(         os.environ.get(             "_MEIPASS2",             os.path.abspath(".")         ),         relative    )产出:# in development>>> resource_path("app_icon.ico")"/home/shish/src/my_app/app_icon.ico"# in production>>> resource_path("app_icon.ico")" /tmp/_MEI34121/app_icon.ico"

Qyouu

所有其他答案都使用当前工作目录如果应用程序不是PyInSTACK(即sys._MEIPASS未设置)。这是错误的,因为它阻止您从脚本所在的目录以外的目录运行应用程序。更好的解决办法:import sysimport osdef resource_path(relative_path):     """ Get absolute path to resource, works for dev and for PyInstaller """     base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))     return os.path.join(base_path, relative_path)
随时随地看视频慕课网APP

相关分类

Python
我要回答