Python attachment in C ++: ImportError: no module named pyfunction

Hey. I am trying to insert python (2.7) in C ++ (g ++ 4.8.2) and therefore call the python function from C ++. This is the basic code provided in the python documentation for embedding:

This is my call_function.cpp file

#include <Python.h> int main(int argc, char *argv[]) { PyObject *pName, *pModule, *pDict, *pFunc; PyObject *pArgs, *pValue; int i; if (argc < 3) { fprintf(stderr,"Usage: call pythonfile funcname [args]\n"); return 1; } /* char pySearchPath[] = "/usr/include/python2.7"; Py_SetPythonHome(pySearchPath);*/ Py_Initialize(); pName = PyString_FromString(argv[1]); /* Error checking of pName left out */ pModule = PyImport_Import(pName); Py_DECREF(pName); if (pModule != NULL) { pFunc = PyObject_GetAttrString(pModule, argv[2]); /* pFunc is a new reference */ if (pFunc && PyCallable_Check(pFunc)) { pArgs = PyTuple_New(argc - 3); for (i = 0; i < argc - 3; ++i) { pValue = PyInt_FromLong(atoi(argv[i + 3])); if (!pValue) { Py_DECREF(pArgs); Py_DECREF(pModule); fprintf(stderr, "Cannot convert argument\n"); return 1; } /* pValue reference stolen here: */ PyTuple_SetItem(pArgs, i, pValue); } pValue = PyObject_CallObject(pFunc, pArgs); Py_DECREF(pArgs); if (pValue != NULL) { printf("Result of call: %ld\n", PyInt_AsLong(pValue)); Py_DECREF(pValue); } else { Py_DECREF(pFunc); Py_DECREF(pModule); PyErr_Print(); fprintf(stderr,"Call failed\n"); return 1; } } else { if (PyErr_Occurred()) PyErr_Print(); fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]); } Py_XDECREF(pFunc); Py_DECREF(pModule); } else { PyErr_Print(); fprintf(stderr, "Failed to load \"%s\"\n", argv[1]); return 1; } Py_Finalize(); return 0; } 

Now my python script is saved as pyfunction.py, placed in the same folder as call_function.cpp.

This is pyfunction.py:

 def multiply(a,b): print "Will compute", a, "times", b c = 0 for i in range(0, a): c = c + b return c 

Now, using the Terminal, I call:

 $ g++ call_function.cpp -I/usr/include/python2.7 -lpython2.7 -o call_function 

(compiles successfully without any errors) (Run the program)

 $ ./call_function pyfunction multiply 2 3 

(I get this ERROR):

 ImportError: No module named pyfunction Failed to load "pyfunction" 

I do not understand how this is possible. I followed the documentation and still get the error.

How can he not find pyfunction.py when it is placed in the same directory.

+10
source share
5 answers

Try the following:

  $ PYTHONPATH=. ./call_function pyfunction multiply 2 3 

if this does not work, try making the __init__.py file in this directory and try again.

UPDATE:

I think PYTHONPATH is a temporary test solution. If you want to have a directory when all your built-in modules live, you should include something equal to this in your built-in interpreter:

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

You can do this probably in python in your interpreter or at level C. This will add a search path just like PYTHONPATH , but will be more robust and elegant (IMHO).

+9
source

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

 PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append(\".\")"); 
+14
source

Hi to everyone who is facing the same problem, I found a solution! setenv () is a function defined in stdlib.h that sets an environment variable. Just need to run it!

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

for more information about setenv:

 $ man setenv 

All the best :) Also thanks to @spinus

+6
source

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

However, if the python file imports an additional library, say, numpy, the above code will work 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, importing a python library from C does not work:

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

Does anyone know how to call python functions from C that depend on some other python libraries?

0
source

You can also try to include this code in 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
source

Source: https://habr.com/ru/post/971541/


All Articles