В настоящее время я работаю над проектом, который выиграл бы от встраивания python в мой код C ++, поскольку кто-то уже реализовал нужную мне функцию в python. В настоящее время я занимаюсь разработкой OSX 10.15 и использую conda для python управления пакетами. Раньше у меня были проблемы с моей программой на c ++, использующей нативный OSX python, но я думаю, что я решил эту проблему, и теперь она, похоже, инициализирует версию python, которая существует в моих каталогах conda. В частности, модуль, который я пытаюсь импортировать, использует библиотеки rdkit
. Я уже скачал их, и у меня нет проблем с запуском автономного скрипта python.
Вот текущее состояние кода:
#define PY_SSIZE_T_CLEAN
#include <Python.h>
int main(int argc, char* argv[]) {
char* pythonHome = (char*) "/Users/david/opt/anaconda3";
Py_SetPythonHome(Py_DecodeLocale(pythonHome, NULL));
Py_Initialize();
PyRun_SimpleString("from rdkit import Chem");
std::cout << Py_GetVersion() << std::endl;
return 0;
}
, а вот Makefile I Я использую, чтобы скомпилировать и связать мою программу на C ++. ОБА CFLAGS и LDFLAGS были сгенерированы с использованием python3.7-config
.
CC = g++
CFLAGSPY3 = -I/Users/david/opt/anaconda3/include/python3.7m -I/Users/david/opt/anaconda3/include/python3.7m -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/david/opt/anaconda3/include -arch x86_64 -I/Users/david/opt/anaconda3/include -arch x86_64
LDFLAGSPY3 = -L/Users/david/opt/anaconda3/lib/python3.7/config-3.7m-darwin -lpython3.7m -ldl -framework CoreFoundation
SAscorerPyTest: SAscorerPyTest.o
$(CC) $(LDFLAGSPY3) -o SAscorerPyTest SAscorerPyTest.o
SAscorerPyTest.o: SAscorerPyTest.cpp
$(CC) $(CFLAGSPY3) -c SAscorerPyTest.cpp
Вот результат работы моей программы:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/Users/david/opt/anaconda3/lib/python3.7/site-packages/rdkit/__init__.py", line 2, in <module>
from .rdBase import rdkitVersion as __version__
ImportError: dlopen(/Users/david/opt/anaconda3/lib/python3.7/site-packages/rdkit/rdBase.so, 2): Symbol not found: _PyBaseObject_Type
Referenced from: /Users/david/opt/anaconda3/lib/libboost_python37.dylib
Expected in: flat namespace
in /Users/david/opt/anaconda3/lib/libboost_python37.dylib
3.7.6 (default, Jan 8 2020, 13:42:34)
[Clang 4.0.1 (tags/RELEASE_401/final)]
По правде говоря, я не знаю слишком много о том, что здесь происходит. Небольшое замечание: если я не включу в свою программу начальные строки о настройке home python, он сразу завершится с ошибкой при инициализации интерпретатора python.