我一直在尝试使用PyInstaller 2.1从我的python脚本中创建单个.exe。运行我的.spec文件但没有“--onefile”选项时,我已经完成了所有工作但事情似乎确实如此当我使用“--onefile”选项运行时出错了。
我搜索了stackoverflow,我发现我有更改路径以包含“_MEIPASS”变量。我已将以下函数添加到我的代码中(感谢stackoverflow!):
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 = getattr(sys, '_MEIPASS', os.getcwd())
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
我用以下内容加载资源:
data_dir = 'resources'
imageClear = resource_path(os.path.join(data_dir, 'Clear.png'))
我的资源包含在我的.spec文件中:
a.datas += [('resources/Clear.png', "C:\\Users\\MyRealName\\Dropbox\\ProjectName\\resources\\Clear.png", 'DATA')]
现在进入有趣的部分,当我构建没有“--onefile”选项的.exe时,一切似乎都有效。当我使用“--onefile”选项构建它时,我收到以下错误:
Error loading Python DLL:
C:\Users\LAUREN~1\Dropbox\DIAGNO~1\PYINST~1.1\DIAGNO~1\build\DIAGNO~1\python27.dll (error code 126)
似乎PyInstaller确实恢复到DOS 8.3文件名,然后找不到它。但是当我没有运行“--onefile”选项时,它不会这样做。我的代码在两个版本之间的唯一区别应该是上面列出的函数。
编辑: python27.dll在那条路径上不存在(它不应该),我不确定为什么PyInstaller正在寻找它。
我在Google和Stackoverflow上搜索了“getattr(sys,'_ MEIPASS',os.getcwd())”是否以某种方式强制DOS 8.3文件名这个但是这个函数似乎没有这样做。
有什么建议吗?
提前致谢!