Ошибка при импорте математики при встраивании Python в C - PullRequest
1 голос
/ 23 марта 2019

Я хотел бы встроить Python в C-приложение.В частности, я хотел бы использовать sympy как часть Python.Для этого я создал чистую установку анаконды.Вот минимальный рабочий пример, который иллюстрирует мою проблему.

int main()
{
    putenv("PYTHONHOME=../anaconda3/bin/python3.7m");
    Py_SetPath(L"../:../anaconda3/lib/python3.7:../anaconda3/lib/python3.7/lib-dynload:../anaconda3/lib/python3.7/site-packages:../anaconda3/lib/python3.7/site-packages/aeosa:../anaconda3/lib/python3.7/site-packages/IPython/extensions:../.ipython");
    Py_Initialize();

    //PyRun_SimpleString("import math\n");
    PyRun_SimpleString("import sympy\n");

    Py_FinalizeEx();

    return (EXIT_SUCCESS)

}

Этот код прекрасно компилируется, но когда я пытаюсь запустить его, я получаю следующую ошибку.

Traceback (most recent call last):
  File "../anaconda3/lib/python3.7/site-packages/sympy/__init__.py", line 19, in <module>
    import mpmath
  File "../anaconda3/lib/python3.7/site-packages/mpmath/__init__.py", line 5, in <module>
    from .ctx_fp import FPContext
  File "../anaconda3/lib/python3.7/site-packages/mpmath/ctx_fp.py", line 1, in <module>
    from .ctx_base import StandardBaseContext
  File "../anaconda3/lib/python3.7/site-packages/mpmath/ctx_base.py", line 3, in <module>
    from .libmp.backend import xrange
  File "../anaconda3/lib/python3.7/site-packages/mpmath/libmp/__init__.py", line 1, in <module>
    from .libmpf import (prec_to_dps, dps_to_prec, repr_dps,
  File "../anaconda3/lib/python3.7/site-packages/mpmath/libmp/libmpf.py", line 7, in <module>
    import math
ImportError: dlopen(../anaconda3/lib/python3.7/lib-dynload/math.cpython-37m-darwin.so, 2): Symbol not found: _PyExc_MemoryError
  Referenced from: ../anaconda3/lib/python3.7/lib-dynload/math.cpython-37m-darwin.so
  Expected in: flat namespace
 in ../anaconda3/lib/python3.7/lib-dynload/math.cpython-37m-darwin.so

Глядя на эту ошибку, появляется сообщение об ошибке «import math».Импорт математики сам по себе дает следующую ошибку, подтверждающую это.

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: dlopen(../anaconda3/lib/python3.7/lib-dynload/math.cpython-37m-darwin.so, 2): Symbol not found: _PyExc_MemoryError
  Referenced from: ../anaconda3/lib/python3.7/lib-dynload/math.cpython-37m-darwin.so
  Expected in: flat namespace
 in ../anaconda3/lib/python3.7/lib-dynload/math.cpython-37m-darwin.so

Я нашел несколько ссылок, где встречались и обсуждались похожие проблемы (например, это , это , это и это ), но решения либо не сработали, либо не были предоставлены, либо я не совсем понял, как они могут относиться к моей проблеме. Это решение предложило добавить следующую строку перед инициализацией, может помочь

void*const libpython_handle = dlopen("libpython3.7m.dylib", RTLD_LAZY | RTLD_GLOBAL);  // update to my python version

Я также попытался

void*const libpython_handle = dlopen("../anaconda3/lib/python3.7/lib-dynload/math.cpython-37m-darwin.so", RTLD_LAZY | RTLD_GLOBAL);

, поскольку именно это (по-видимому) является причиной проблемы.Ни один не работал.Похоже, что проблема связана с проблемами зависимости с файлами lib-dynload / * (обсуждается здесь ), но до сих пор я не смог найти обходной путь.

Как я могурешить эту проблему?

Редактировать:

Я использую MacOS

...