Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyinstaller无法加载存在的dll_Python_Path_Pyinstaller_Pymunk - Fatal编程技术网

Python pyinstaller无法加载存在的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\

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\\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抱怨它找不到它。它在_MEIPASS
PATH
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