py2app TypeError: dyld_find() получил неожиданный аргумент ключевого слова «загрузчик»

У меня возникли трудности с созданием моего приложения с использованием 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'

person SGB    schedule 06.07.2015    source источник


Ответы (2)


Это временное решение, и оно может сломать другие вещи. Я бы порекомендовал сделать это в виртуальной среде, чтобы вы не испортили свои обычные пакеты. Это сработало для меня (virtenv — это имя моей виртуальной среды)

Откройте файл /virtenv/lib/python3.4/site-packages/macholib/dyld.py и замените каждый экземпляр loader_path на loader. Теперь сохраните и повторите попытку.

person Michal    schedule 23.09.2015
comment
Спасибо Михал за ваш пост. Внесение этих предложенных изменений позволило построить мою программу без ошибок. Хотя, когда я дважды щелкаю свое приложение, оно не работает. Если я попытаюсь выполнить отладку, перейдя к dist > (right-click) show package contents on the .app file > Contents > MacOS > 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, но я знаю только его. - person SGB; 25.09.2015
comment
Да, проблема, из-за которой я наткнулся на это, была связана с matplotlib. Я также заметил, что импорт модулей работает немного по-другому при сборке с помощью py2app (код, который обычно работает, выдает ошибки импорта). Как вы импортируете изображение в свой код? Что произойдет, если вы попытаетесь импортировать его другим способом. - person Michal; 25.09.2015
comment
На данный момент я импортирую модуль с 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) несколькими строками ниже. Вы импортировали каким-либо другим способом, который не вызвал ошибку? - person SGB; 29.09.2015
comment
Сначала я использовал from tkinter import filedialog, а затем вызвал filedialog.asksaveasfile() - это работало нормально, но выдавало и импортировало ошибку при запуске приложения, созданного py2app. Я изменил его на from tkinter.filedialog import asksaveasfile и соответственно изменил вызов. Это сработало в обоих случаях. - person Michal; 29.09.2015
comment
Просто добавлю, что сначала я не думал, что это решение, поскольку мое приложение все еще зависало после его сборки py2app, но после этого я понял, что это произошло потому, что мне нужно было включить пакет PIL в параметры файла setup.py. Обычно это работает; однако я наткнулся на другую проблему с не загружаемыми изображениями, о которой я разместил еще один вопрос: stackoverflow.com/questions/33302918/ - person SGB; 23.10.2015
comment
Просто небольшой мод, чтобы гарантировать, что и загрузчик, и loader_path могут использоваться в качестве аргументов - мои правки: def dyld_loader_search(name, loader_path=None, **kwargs): if loader_path is None and "loader" in kwargs: loader_path = kwargs["loader"] def dyld_find(name, executable_path=None, env=None, loader_path=None, **kwargs): """ Find a library or framework using dyld semantics """ if loader_path is None and "loader" in kwargs: loader_path = kwargs["loader"] - person Lee Kamentsky; 13.01.2016

Вы можете пропатчить 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
person Neapolitan    schedule 13.06.2016
comment
Хотя я не получаю ошибку во время сборки, я вижу, что это Modules not found (conditional imports): * Image (/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/py2app/recipes/PIL/prescript.py)и приложение не работает. Я что-то пропустил ? - person Lich4r; 16.10.2016
comment
Кажется, здесь есть ответ: stackoverflow.com/questions/30820906 - person Neapolitan; 18.10.2016
comment
То же предупреждающее сообщение, но скрипт работает :) Спасибо - person Lich4r; 18.10.2016
comment
macholib.__version__ <= "1.7" не лучший тест для версий 1.10, 1.11 и т. д. - person GP89; 12.08.2019