Python pyinstaller无法加载存在的dll
Windows 7 64位-Python 2.6 32位-Pymunk 4.0.0 好的,谢谢你。这花了我很长时间,但我现在明白了如何使用Pyinstaller将我想要的任何东西都放入exe。但是,存在的特定dll仍然无法加载-Python pyinstaller无法加载存在的dll,python,path,pyinstaller,pymunk,Python,Path,Pyinstaller,Pymunk,Windows 7 64位-Python 2.6 32位-Pymunk 4.0.0 好的,谢谢你。这花了我很长时间,但我现在明白了如何使用Pyinstaller将我想要的任何东西都放入exe。但是,存在的特定dll仍然无法加载-chipmunk.dll。 这是Pyinstaller的.spec文件 # -*- mode: python -*- a = Analysis(['Mesh_Animator.py'], pathex=['C:\\Users\\username\
chipmunk.dll
。
这是Pyinstaller的.spec文件
# -*- mode: python -*-
a = Analysis(['Mesh_Animator.py'],
pathex=['C:\\Users\\username\\workspace\\2D_Mesh_Animator'],
hiddenimports=[],
hookspath=None)
import os, pymunk
pymunk_dir = os.path.dirname(pymunk.__file__)
chipmunk_libs = [
('chipmunk.dll', os.path.join(pymunk_dir, 'chipmunk.dll'), 'BINARY'),
]
a.datas+=[('imagetest.jpg','imagetest.jpg','DATA')]
a.binaries+=chipmunk_libs
#or just
#a.binaries+=[('chipmunk.dll','chipmunk.dll','BINARY')]
#both seem to work the say way
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name=os.path.join('dist', 'Mesh_Animator.exe'),
debug=False,
strip=None,
upx=True,
console=True )
这一切都没有问题。只要exe旁边有dll,图像就可以正常加载,这样我就不会出错。我通过比较包含dll的之前和之后的版本来确认dll是否存在。160 kb的差异。然后我用它来检查在Pyinstallers exe环境下启动时dll是否在当前路径中
try:
print os.listdir(sys._MEIPASS).count("chipmunk.dll"),"dlls"
except:
#not in pyinstaller
print 0,"dlls"
我在输出中得到了一个精确的
1 DLL
,但pymunk抱怨它找不到它。它在_MEIPASSPATH
dir中,那么为什么pymunk找不到它?dll位于根目录中,因此不需要搜索。如何让pymunk搜索正确的位置?我认为这与pymunk在冻结时如何尝试查找chipmunk.dll的路径有关。显然,当所有文件都打包到一个文件中时,需要特殊代码。能否将libload.py文件替换为此文件并重试:
(目前我自己无法尝试这一点,因此这是要点。如果它有效,我将提交给真正的pymunk repo)这段代码似乎在加载DLL时对搜索路径设置了相当高的优先级。你可以把它放在你课程开始的时候 我有一个类似的问题,它对我有效:)
您的python是32位还是64位?Pymunk目前只支持windows.com上的32位python。我现在就试试。对不起,我来晚了。我的收件箱客户端最近无法检查我的电子邮件。文件“C:\Users\kaliber\workspace\2D\U Mesh\U Animator\Mesh\U Animator.py”,第892行,在更新self.Physical\u World.step(已用)文件“C:\Python26\lib\site packages\pymunk\u init\uu.py”中,第374行,在步骤cp.cpSpaceStep(self.\u space,dt)值错误:调用过程时参数不足(缺少12个字节)或者调用conventionSo时出错。在运行pyinstaller时,它在打包时加载了dll。奇怪。但是!它确实加载了exe准备好的dll。但是我仍然收到上面的错误。很抱歉,我不知道如何修复该过程。非常感谢。我会尝试一下。我唯一处理过的问题是-我只需要将dll放在最后一个e的旁边xe。这没什么大不了的。但我想对于一些项目,我希望能够只分发一个exe。这就是我处理我的问题的方式:首先通过将缺少的DLL放在exe旁边来识别它们。然后用
a.binaries+=(等等,'BINARY')打包它们
并在上面添加行以设置要搜索DLL的目录。然后您可以在exe旁边丢弃DLL。需要注意的重要事项:SetDllDirectory将阻止exe在当前目录中搜索DLL,并改为查看\u MEIPASS
。链接到有趣的参考
try:
import win32api
win32api.SetDllDirectory(sys._MEIPASS)
except:
pass