cx_Freeze Mac-build остановился на _ctypes для Homebrew-and-Python - PullRequest
0 голосов
/ 23 января 2019

Мы используем cx_Freeze для создания автономной двоичной сборки нашего приложения на Python под Mac OS. Сборка работает хорошо под машиной сборки (на которой установлен Homebrew-and-Python), но на клиентской машине произошла ошибка со следующими сообщениями об ошибках.

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/cx_Freeze/initscripts/__startup__.py", line 14, in run
      module.run()
  File "/usr/local/lib/python2.7/site-packages/cx_Freeze/initscripts/Console.py", line 26, in run
      exec(code, m.__dict__)
  File "./utest2.py", line 15, in <module>
      from ttLib import *
  File "ttLib.py", line 848, in init ttLib
      import ctypes
  File "/usr/local/Cellar/python@2/2.7.15_1/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 7, in <module>
      from _ctypes import Union, Structure, Array


ImportError: dlopen(/Users/gff/src/TextSeek_test/build/test_build/lib/_ctypes.so, 2): Symbol not found: __PySlice_AdjustIndices
  Referenced from: /Users/gff/src/TextSeek_test/build/test_build/lib/_ctypes.so
  Expected in: flat namespace
 in /Users/gff/src/TextSeek_test/build/test_build/lib/_ctypes.so

Просматривая ответы от stackoverflow о «__PySlice_AdjustIndices» и «плоском пространстве имен», мы подозреваем, что эта ошибка была вызвана конфликтом python между версией системы по умолчанию и версией homebrew.

Затем мы используем « brew install python @ 2 » на клиентском компьютере, и ошибка ctypes исчезла. Мы запускаем « brew uninstall python @ 2 », эта ошибка возвращается обратно.

Вопрос: как мы можем встроить необходимую часть homebrew-python, чтобы обойти эту ошибку ctype?

Мы использовали " otool -L lib / _ctypes.so ", чтобы узнать зависимость динамически связанного файла, он показал только один файл " / usr / lib / libSystem.B. dylib ». Этот файл не имеет отношения к python.

Любой совет, чтобы двигаться вперед?


Dev Информация о машине: Mac High Sierra, python 2.7.15 64bit. Используйте homebrew-python для сборки.

setup.py для cx_Freeze:

build_exe_options = {
    "packages":  ["wcwidth", "watchdog", "xlrd", "jinja2", "subprocess"],
    "excludes": [ "AppKit", "Carbon", "CoreFoundation", "Finder", "Foundation", "FSEvents", "objc"],
    "include_msvcr": True,
    "zip_include_packages":["winshell", "wcwidth", "watchdog", "pyhk", "xlrd", "jinja2",\
        "argh", "ctypes",  "email", "encodings" ]
    }
exeList = [Executable( "utest2.py", base = None, targetName= "utest")  ]

setup(  name = "XXX",
        description = u"XXX desc",
        options = {
            "build_exe": build_exe_options,
            'bdist_mac': {
                'bundle_name': "XXX",
            }

        },
        executables = exeList)

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Я нашел решение сам.

Эта проблема вызвана ошибочно связанными файлами dylib. Мы используем " otool -L ", чтобы найти зависимость и повторно связать их с " install_name_tool -change " по одному. Наконец программа работает.

0 голосов
/ 25 января 2019
  1. На клиентском компьютере после установки замороженного приложения попробуйте вручную скопировать все динамические библиотеки (.so, .dylib, ...?), Которые находятся в подкаталоге lib сборки каталог в сам каталог сборки. Скопируйте также все динамические библиотеки из каталога сборки в его подкаталог lib. Решает ли это проблему? На сборочной машине вы, конечно, должны использовать ту же версию Python для создания замороженного приложения, что и для запуска незамерзающего приложения.

  2. Если 1. решает проблему, выясните, какие динамические библиотеки необходимо скопировать, чтобы приложение работало (то есть выясните, какие из выполняемых вами действий копирования вручную действительно необходимы). Используйте include_files список build_exe параметров в вашем скрипте установки, чтобы позволить cx_Freeze автоматически включать динамическую библиотеку на этапе сборки. Вы можете использовать кортеж (source, destination) в качестве элемента в списке include_files, чтобы позволить cx_Freeze скопировать файл из source в определенный destination в каталог сборки.

Объяснение: Я не знаю Mac / OS. Но я полагаю, что описанная вами проблема может быть связана с аналогичной проблемой с Microsoft Visual C++ Redistributable DLLs под Windows: cx_Freeze 5.1.1 включает пакеты в подкаталоге lib каталога сборки в предыдущих версиях из cx_Freeze они были в самом каталоге сборки. Некоторые динамические библиотеки необходимо найти в каталоге сборки, но они ошибочно включены в подкаталог lib с помощью cx_Freeze или наоборот. На сборочном компьютере это обычно не проблема, поскольку копия библиотеки обычно находится в системном пути, но на клиентском компьютере часто не удается найти копию библиотеки по системному пути или несовместимую.

Кстати, опция build_exe "include_msvcr": True не работает в cx_Freeze 5.1.1, см. эту проблему .

...