Py_Initialize throws ModuleNotFoundError: нет модуля с именем 'encodings' - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь запустить пример «Встраивание Python в другое приложение», найденный по адресу https://docs.python.org/3/extending/embedding.html#very-high-level-embedding на моем MacOS.Хотя я могу заставить программу компилироваться с моим дистрибутивом Anaconda Python3.7 и SCons, при ее запуске всегда выдается следующая ошибка:

Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

Я попробовал совет, данный в этом посте StackOverflow Как устранить неполадки Python «Не удалось найти независимые от платформы библиотеки » , установив для моей переменной PYTHONHOME значение / usr / local, мой корневой каталог Anaconda и родительский каталог исполняемого файла Python.Я также попытался установить мою переменную PYTHONPATH для каждой из папок.Тем не менее, установка PYTHONHOME приведет к сбою моей установки Anaconda Python с сообщением:

Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

У меня нет настроенной виртуальной среды Python, и Python отлично работает за пределами этого примера встраивания и установки PYTHONHOMEпеременная.Кроме того, родительская папка двоичного файла Anaconda Python является первой папкой в ​​моей переменной PATH, поэтому я знаю, что Py_Initialize не найдет установку Python по умолчанию для MacOS по умолчанию.Я попытался удалить и переустановить Anaconda, но та же ошибка сохраняется.Следующий код - мой файл SConstruct, использованный для компиляции примера.

env = Environment(
    CPPPATH=[
        "/Users/user/anaconda3/include",
        "/Users/user/anaconda3/include/python3.7m"
    ],
    LIBPATH=["/Users/user/anaconda3/lib/python3.7/config-3.7m-darwin"],
    LIBS=["dl", "python3.7m"]
)

env.Program("wrapper", "wrapper.c")

Любая помощь или совет приветствуются.Спасибо.

1 Ответ

0 голосов
/ 09 февраля 2019

Это будет зависеть от того, как настроены библиотеки python.Я предполагаю, что они используют RPATH, и в этом случае вы можете сделать свою среду такой:

env = Environment(
    CPPPATH=[
        "/Users/user/anaconda3/include",
        "/Users/user/anaconda3/include/python3.7m"
    ],
    LIBPATH=["/Users/user/anaconda3/lib/python3.7/config-3.7m-darwin"],
    LIBS=["dl", "python3.7m"],
    LINKFLAGS='-rpath /Users/user/anaconda3/lib/python3.7/config-3.7m-darwin'
)

env.Program("wrapper", "wrapper.c")

, в этой папке конфигурации должны быть некоторые динамические библиотеки, на которых вы можете запустить otool:

otool -L libpython3.7.dylib

Который должен печатать, как библиотека связывается компоновщиком.

Вы можете найти больше информации здесь:

https://stackoverflow.com/a/31824839/1644736 https://wincent.com/wiki/@executable_path,_@load_path_and_@rpath

...