Мы используем 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)