#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>