Как связать правильную версию python при встраивании в C ?

#python #c #macos #python-3.7 #python-embedding

#питон #c #macos #python-3.7 #python-встраивание

Вопрос:

Я встроил интерпретатор python в код C . Он отлично работает для высокоуровневого способа с:

 PyRun_SimpleFileEx(fd, "/file_path/some_script.py", 1)
 

Но мне нужно передать некоторые аргументы в код python, поэтому я попытался перейти к некоторому коду из документации python о встраивании. Однако XCode жалуется на некоторые функции, которые не определены. Я предполагаю, что мой

 #include <Python/Python.h>
 

Не добавляет правильную версию python и указывает, возможно, на версию системы (2.7), в которой нет заголовков с правильными функциями.

Мои флаги компоновщика:

 -lpython3.7m -ldl -framework CoreFoundation
 

Я добавил папку Python include из фреймворка в пути поиска заголовка:

 ../../Support/Lib/Python/include
 

и папка Python Lib из фреймворка в пути поиска библиотеки:

 ../../Support/Lib/Python/lib
 

Папка поддержки похожа на указанные папки из решения.

Функции , которые XCode не может найти , — это PyUnicode_DecodeFSDefault() and Py_FinalizeEx() .

Первый определен в unicodeobject.h том, что включается по Python.h праву, где он должен находиться в папке include, как я описал выше.

Я не уверен, что я делаю не так, так что, может быть, кто-нибудь сможет указать мне правильное направление. Заранее спасибо!

Комментарии:

1. Вы можете использовать заголовки Python 2.7, точка. У вас должны быть заголовки Python 3.7, стоящие первыми в списке ваших путей включения, в противном случае вы получите случайный успех или неудачи.

2. Использование заголовков 2.7 помогло устранить ошибки, но сценарий python, который я хочу выполнить, — это python 3. Поэтому мне нужно получить правильную ссылку для python3. Включение include сверху не решило проблему, с которой он все еще связывает python2. Есть еще какие-нибудь идеи?

3. Таким образом, #include <Python/Python.h> определенно включает в себя python 2.7 по умолчанию из системы. Есть идеи, как это изменить?

4. Нет, это не просто ссылка, вам также нужно получить заголовки Python 3. Они несовместимы друг с другом! (мой комментарий удаляет can **’t **). Вы НЕ МОЖЕТЕ использовать заголовки Python 2 и ссылаться на Python 3.

5. Да, вы правы, и я изменил ссылки и заголовочные файлы, на которые были связаны ссылки. В итоге проблема заключалась в том, что я не вставил правильный оператор include, поэтому, когда я взял #include <Phython/Python>, он всегда включал системный Python2 по умолчанию. Итак, проблема была не в ссылках. Но мой путь к ссылке также не доходил до последней папки, в которой был заголовок. Извините за путаницу, я новичок в этой теме. Спасибо за вашу помощь!

Ответ №1:

Ладно, как всегда, дьявол кроется в деталях… Я понял, что мне нужно только передать полный путь непосредственно до верхнего каталога заголовочных файлов, которые мне нужны. Поиск в подкаталогах не производится. Итак, мой путь поиска в заголовке таков:

 ../../Support/Lib/Python/include/python3.7m
 

и мой путь поиска в библиотеке:

 ../../Support/Lib/Python/lib/python3.7 and then just include
 

Чтобы включить, я, наконец, только что сделал:

 #include <Python.h>