【问题标题】:py2app TypeError: dyld_find() got an unexpected keyword argument 'loader'py2app TypeError: dyld_find() got an unexpected keyword argument 'loader'
【发布时间】:2015-09-23 06:11:13
【问题描述】:

我在使用 py2app 构建我的应用程序时遇到了困难。我可以使用此命令以别名模式构建它而不会出现问题:

python3.4 setup.py py2app -A

但是,当我尝试使用以下方法构建它时:

python3.4 setup.py py2app

我根据这篇文章的标题收到错误消息。根据我所做的研究,我认为这是 Pillow 的问题;但是我需要这个应用程序的枕头。 (除非我可以使用另一个模块来导入图像??)。我也试过 cx_freeze 没有成功。

非常感谢任何帮助或指导。

完整回溯如下:

Traceback (most recent call last):
File "setup.py", line 19, in <module>
setup_requires=['py2app'],
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/
distutils/core.py", line 148, in setup dist.run_commands()
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/
distutils/dist.py", line 955, in run_commands self.run_command(cmd)
File"/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/
distutils/dist.py", line 974, in run_command cmd_obj.run()
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/
site-  packages/py2app/build_app.py", line 659, in run self._run()
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/
site- packages/py2app/build_app.py", line 865, in _run self.run_normal()
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/
site- packages/py2app/build_app.py", line 959, in 
run_normal self.create_binaries(py_files, pkgdirs, extensions,loader_files)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/
site- packages/py2app/build_app.py", line 1214, in create_binaries
platfiles = mm.run()
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/
site-packages/macholib/MachOStandalone.py", line 105, in run
mm.run_file(fn)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/
site-packages/macholib/MachOGraph.py", line 84, in run_file
self.scan_node(m)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/
site-packages/macholib/MachOGraph.py", line 110, in scan_node 
m =  self.load_file(filename, caller=node)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/
site-packages/macholib/MachOGraph.py", line 93, in load_file
newname = self.locate(name, loader=caller)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/
site-packages/macholib/MachOStandalone.py", line 23, in locate
newname = super(FilteredMachOGraph, self).locate(filename, loader)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/
site-packages/macholib/MachOGraph.py", line 49, in locate
loader=loader.filename)
TypeError: dyld_find() got an unexpected keyword argument 'loader'

【问题讨论】:

    标签: python-3.x osx-lion pillow py2app


    【解决方案1】:

    这是一个临时解决方案,它可能会破坏其他东西。我建议这样做是一个虚拟环境,这样你就不会弄乱你的常规包。这对我有用(virtenv 是我的虚拟环境的名称)

    打开文件/virtenv/lib/python3.4/site-packages/macholib/dyld.py 并将loader_path 的每个实例替换为loader。现在保存并重试。

    【讨论】:

    • 感谢米哈尔的帖子。进行这些建议的更改使我的程序可以毫无错误地构建。虽然当我双击我的应用程序时,它不起作用。如果我尝试通过转到dist &gt; (right-click) show package contents on the .app file &gt; Contents &gt; MacOS &gt; my.app 进行调试,终端会说:Traceback (most recent call last): File "/Users/Name/Python programs/dist/BAWP.app/Contents/Resources /__boot__.py", line 67, in_recipes_pil_prescript import Image ImportError: No module named 'Image' 我认为问题在于 Pillow 不能很好地与 py2app 配合使用,但它是我所知道的唯一一个。
    • 是的,导致我偶然发现的问题与 matplotlib 有关。我还注意到,使用 py2app 构建时,导入模块的工作方式有所不同(正常工作的代码会引发导入错误)。您如何在代码中导入图像?如果您尝试以不同的方式导入它会发生什么。
    • 目前我使用from PIL import Image, ImageTk 导入模块。据我所知,只有一种方法可以导入图像。除非我弄错了? ... 对于标准图像导入,我使用 ImageTk.PhotoImage(file = "/Users/Name/image.png"),对于 gif 图像,我使用 image = PhotoImage(data = b64_data),对于来自网站的图像,我使用 pil_image = Image.open(data),然后再往下几行使用 image = ImageTk.PhotoImage(pil_image)。您是否以任何其他未引发错误的方式导入?
    • 一开始我使用from tkinter import filedialog,然后调用filedialog.asksaveasfile() - 这工作正常,但在运行由py2app构建的应用程序时抛出并导入错误。我将其更改为 from tkinter.filedialog import asksaveasfile 并相应地更改了呼叫。这在两种情况下都有效。
    • 只是补充一下,起初我不认为这是解决方案,因为我的应用程序在 py2app 构建后仍然崩溃,但后来我发现这是因为我需要在其中包含 PIL 包setup.py 文件选项。通常这会起作用;但是我偶然发现了我的图像无法加载的另一个问题,我发布了另一个问题:stackoverflow.com/questions/33302918/…
    【解决方案2】:

    您可以对 macholib 进行猴子补丁,而不是在站点包中修改它。将以下文件放到 setup_py2app.py 所在目录,并在顶部添加import macholib_patch

    macholib_patch.py​​:

    """
    Monkey-patch macholib to fix "dyld_find() got an unexpected keyword argument 'loader'".
    
    Add 'import macholib_patch' to the top of set_py2app.py
    """
    
    import macholib
    #print("~"*60 + "macholib verion: "+macholib.__version__)
    if macholib.__version__ <= "1.7":
        print("Applying macholib patch...")
        import macholib.dyld
        import macholib.MachOGraph
        dyld_find_1_7 = macholib.dyld.dyld_find
        def dyld_find(name, loader=None, **kwargs):
            #print("~"*60 + "calling alternate dyld_find")
            if loader is not None:
                kwargs['loader_path'] = loader
            return dyld_find_1_7(name, **kwargs)
        macholib.MachOGraph.dyld_find = dyld_find
    

    【讨论】:

    • 虽然我在构建过程中没有收到错误消息,但我看到了这个Modules not found (conditional imports): * Image (/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/py2app/recipes/PIL/prescript.py)并且应用程序无法正常工作。我错过了什么吗?
    • 这似乎在这里得到了回答:stackoverflow.com/questions/30820906
    • 同样的警告信息,但脚本正在运行 :) 谢谢
    • macholib.__version__ &lt;= "1.7" 在升级到 1.10、1.11 等版本时并不是一个很好的测试。
    猜你喜欢
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 2022-01-12
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多