Pyinstaller не найден подходящий образ

#macos #build #pyinstaller #python-3.7

#macos #сборка #pyinstaller #python-3.7

Вопрос:

В моей системе установлен PyInstaller версии 4.0. Я пытаюсь создать скрипт на python, используя python 3.7.3. Этот скрипт на python импортирует другие скрипты на Python, которые имеют свои собственные инструкции импорта.

Я создаю с помощью команды:

pyinstaller —noconfirm —очистить script_to_build.py

Однако, когда я запускаю новый созданный двоичный файл, я получаю следующую ошибку:

Когда файл будет собран, внутри папки dist будет папка Foundation с двумя файлами, _Foundation.cpython-37m-darwin.so и _inlines.cpython-37m-darwin.so и все же он жалуется на отсутствие библиотеки Foundation. Что означает это сообщение об ошибке и как мне это исправить?

 Traceback (most recent call last):
  File "PyInstaller/loader/pyiboot01_bootstrap.py", line 144, in __init__
  File "ctypes/__init__.py", line 348, in __init__
OSError: dlopen(./dist/script_to_build/Foundation, 6): no suitable image found.  Did find:
    ./dist/script_to_build/Foundation: not a file
    ./dist/script_to_build/Foundation: not a file

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "script_to_build.py", line 66, in <module>
    import script1
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "/Library/Python/3.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 493, in exec_module
    exec(bytecode, module.__dict__)
  File "script1.py", line 19, in <module>
    import pyautogui
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "/Library/Python/3.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 493, in exec_module
    exec(bytecode, module.__dict__)
  File "pyautogui/__init__.py", line 241, in <module>
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "/Library/Python/3.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 493, in exec_module
    exec(bytecode, module.__dict__)
  File "mouseinfo/__init__.py", line 100, in <module>
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "/Library/Python/3.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 493, in exec_module
    exec(bytecode, module.__dict__)
  File "rubicon/objc/__init__.py", line 15, in <module>
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "/Library/Python/3.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 493, in exec_module
    exec(bytecode, module.__dict__)
  File "rubicon/objc/runtime.py", line 89, in <module>
  File "rubicon/objc/runtime.py", line 66, in load_library
  File "PyInstaller/loader/pyiboot01_bootstrap.py", line 146, in __init__
__main__.PyInstallerImportError: Failed to load dynlib/dll './dist/script_to_build/Foundation'. Most probably this dynlib/dll was not found when the application was frozen.
  

Ответ №1:

Наконец-то разобрался. Вот обновленная команда, которая работает:

 pyinstaller --add-binary "/System/Library/Frameworks/Foundation.framework/Versions/C/Resources/BridgeSupport/Foundation.dylib:." --onefile --noconfirm --clean script_to_build.py
  

Я смог скомпилировать программу с этим, но при выполнении двоичного файла я получил ошибку «../../../../../../../../../ Не удалось извлечь библиотеку/Python/3.7m/include/pyconfig.h!» Чтобы исправить эту ошибку, мне пришлось изменить функцию relpath_to_config_or_make(filename) file /Lirary/Python/3.7/site-packages/PyInstaller/utils/hooks/init.py следующим образом:

 def relpath_to_config_or_make(filename):
    """
    The following is refactored out of hook-sysconfig and hook-distutils,
    both of which need to generate "datas" tuples for pyconfig.h and
    Makefile, under the same conditions.
    """

    # Relative path in the dist directory.
    prefix = _find_prefix(filename)
    rel_path = os.path.relpath(os.path.dirname(filename), prefix)
    if '../' in rel_path and is_darwin:
        new_path = os.path.relpath(os.path.abspath(rel_path), os.path.expanduser('~'))
    else:
        new_path = os.path.relpath(os.path.dirname(filename), prefix)
    return new_path
  

Источник проблемы «не удалось извлечь»