2

I would like to embed python into a C application. Specifically, I would like to use sympy as part of the python portion. To accomplish this I created a clean install of anaconda. Here is a minimal working example that illustrates my problem.

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)

}

This code compiles fine, but when I attempt to run it I get the following error.

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

Looking at this error it appears that there is an error on "import math". Importing math by itself gives the following error confirming this.

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

I found several references where similar problems were encountered and discussed (e.g. this, this, this, and this), but the solutions have either not worked, weren't provided, or I didn't fully understand how they might relate to my problem. This solution suggested adding the following line before initialize may help

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

I also tried

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

as this specifically is (apparently) what's causing the problem. Neither worked. It appears that the problem is related to dependency problems with lib-dynload/* files (discussed here), but thus far I have not been able to find a workaround.

How might I fix this problem?

Edit:

I am using MacOS

1
  • I am working on the same thing. I was able to resolve this specific issue by adding -framework Python to my gcc command. However this gives me another "Symbol not found" error but this time on __Py_FalseStruct. If you have this working on your end I would love to hear how you solved it! Commented Jun 6, 2019 at 14:04

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.