繁体   English   中英

pyinstaller无法加载存在的dll

[英]pyinstaller fails to load a dll that is present

Windows 7 64位-Python 2.6 32位-Pymunk 4.0.0

好的,感谢通过Pyinstaller使用Pymunk 我花了很长时间,但现在我了解了如何使用Pyinstaller将想要的东西扔进exe。 但是,仍然无法加载特定的dll- 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 dlls ,但是pymunk抱怨找不到它。 它在_MEIPASS PATH目录中,所以pymunk怎么找不到它? 该dll位于根目录中,因此无需搜索。 如何让pymunk搜索正确的位置?

我认为这与pymunk冻结时如何尝试找到chipmunk.dll的路径有关。 当所有文件打包成一个文件时,显然需要特殊代码。 您可以用这个文件替换libload.py文件,然后重试: https ://gist.github.com/viblo/44ccd6af88d9f050403b

(目前,我不能自己尝试此操作,因此要点。如果可行,我将其提交给真正的pymunk回购)

这段代码似乎在加载DLL时通过搜索路径设置了较高的优先级。 您可以将其放在程序入口点的开头。

我有一个类似的问题,它对我有用:)

try:
    import win32api
    win32api.SetDllDirectory(sys._MEIPASS)
except:
    pass 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM