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

HXSP1947
  • 1,311
  • 1
  • 16
  • 39
  • 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! – fridgerator Jun 06 '19 at 14:04

0 Answers0