Python Embedding in C++ : ImportError: No module named pyfunction

后端 未结 6 622
栀梦
栀梦 2021-02-07 11:32

Hi I\'m trying to embed python (2.7) into C++ (g++ 4.8.2) and hence call a python function from C++. This is the basic code provided in python documentation for embedding:

相关标签:
6条回答
  • 2021-02-07 11:51

    For anyone else having this problem:

    Are you sure that your .py file lies in the same directory where C++ executable is?

    I was programming in CLion and forgot that executable lies in cmake-build-debug. So I added .py file in project directory and no no surprise I was getting the same error ImportError. I placed .py file to cmake-build-debug (executable file by default lies there), used answers from this question and everything worked!

    0 讨论(0)
  • 2021-02-07 11:58

    You can also try to include these code to your c program

    Py_Initialize();
    PyObject *sys = PyImport_ImportModule("sys");
    PyObject *path = PyObject_GetAttrString(sys, "path");
    PyList_Append(path, PyUnicode_FromString("."));
    

    Learn from Here

    0 讨论(0)
  • 2021-02-07 11:59

    Hi to all those facing the same problem, I found the solution! setenv() is a function defined in stdlib.h which sets the environment variable. Just have to run it!

    setenv("PYTHONPATH",".",1);
    

    for more info on setenv:

    $ man setenv
    

    All the best :) Also, thanks to @spinus

    0 讨论(0)
  • 2021-02-07 12:04

    Put the following in the C/C++ code, just after Py_Initialize();

    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append(\".\")");
    
    0 讨论(0)
  • 2021-02-07 12:13

    the solution provided by spinus works if the python file does not import any additional python-library.

    However, if a python file imports an additional library, lets say numpy, the above code crashes as follows:

    :~/programs/python$ ./a.out myModule multiply 4 3
    Traceback (most recent call last):
      File "/home/a/programs/python/myModule.py", line 1, in <module>
        import numpy
    ImportError: No module named 'numpy'
    Failed to load "myModule"
    

    As a remark, the import of the python-library from C does not work:

    PyObject *pNumpy = PyUnicode_FromString("numpy");
    PyObject *pModuleA = PyImport_Import(pNumpy); 
    

    Does someone know how to call from C python-functions, which depend of some other python-libraries?

    0 讨论(0)
  • 2021-02-07 12:14

    Try this one:

     $ PYTHONPATH=. ./call_function pyfunction multiply 2 3
    

    if this won't work, try to make __init__.py file in this directory and try again.

    UPDATE:

    I think that PYTHONPATH is temporary solution, to test stuff. If you want to have a directory when all your embedded modules lives you have to put in your embedded interpreter something equilevant to this:

    import sys
    sys.path.insert(0, "./path/to/your/modules/")
    

    You can do it probably in python in your interpreter or on C level. This will add search path in very similar manner as PYTHONPATH but it is more persistant and elegant (IMHO).

    0 讨论(0)
提交回复
热议问题