Python Проблемы с импортом в модуль C ++ - PullRequest
0 голосов
/ 27 января 2020

В настоящее время я работаю над проектом, который выиграл бы от встраивания 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.

...