pyinstaller无法加载存在的DLL

时间:2014-05-08 11:04:33

标签: python path pyinstaller pymunk

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

好的,感谢Using Pymunk with Pyinstaller。我花了很长时间,但我现在明白了如何使用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搜索到正确的位置?

2 个答案:

答案 0 :(得分:0)

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

(目前我不能自己尝试这个,因此要点。如果它有效,我会把它交给真正的花栗鼠回购)

答案 1 :(得分:0)

这段代码似乎在加载DLL时搜索的路径上设置了相当高的优先级。您可以将其放在入口点的最开始处。

我有类似的问题,它适用于我:)

try:
    import win32api
    win32api.SetDllDirectory(sys._MEIPASS)
except:
    pass 
相关问题