从相对路径加载C ++中的Python模块

时间:2016-11-22 13:17:55

标签: python c++

我在我的主目录(/home/sunil/test.cc)上写了C ++程序

我的Python模块位于以下路径: - (/projects/name/dir/subdir/test.py)

我正在尝试使用以下Python-C API PyImport_ImportModule函数在C ++中导入python模块。

PyImport_ImportModule(/projects/name/dir/subdir/test.py)

我给出了完整的路径作为函数的参数,如上所示,但它没有给出任何编译错误,但是当我尝试从python模块打印任何变量值时,它会给出分段错误问题。

这里有几个问题: -

  1. 如果无法加载python模块,那么它是如何不给出任何编译错误的?

  2. 如何提供python模块名称以从我的主C ++程序的某个相对路径加载它?

  3. test.py代码

    n = 10
    d = {1:5,2:10}
    

    test.cc代码

    #include <Python.h>   
    #include <iostream>
    #include <string>
    #include <cstring>
    using namespace std;
    
    void c_python_intf(long long int i1,const char* s1,long long int i2)
    {
       PyObject *mymod = NULL;
       PyObject *testmod = NULL;
       PyObject *py_attr_num = NULL;
       PyObject *python_func,*args,*myResult,*myData,*myString,*myNum;
       const char* py_var;
       long long int myData_updated;
       string myString_updated;
       long long int myNum_updated;
       cout << "input to c function is " << i1 << "\t\t" << s1 << "\t\t" << i2 << endl ;
       PyGILState_STATE gstate;
       gstate = PyGILState_Ensure();  
       string st = "/projects/name/dir/subdir";
       char *path;
       path = st.c_str();
       PySys_SetPath(path);
       // testmod = PyImport_ImportModule(".projects.name.dir.subdir.py_module");
       // testmod = PyImport_ImportModule("/projects/name/dir/subdir/py_module");
       testmod = PyImport_ImportModule("py_module");
       py_attr_num = PyObject_GetAttrString(testmod, "n");
       PyObject_Print(py_attr_num,stdout,0);
       cout << stdout << endl;
       py_attr_num = PyObject_GetAttrString(testmod, "d");
       PyObject_Print(py_attr_num,stdout,0);
       cout << stdout << endl;  
     }
    
     static PyMethodDef myModule_methods[] = { 
           {NULL, NULL} 
     };
    
     extern "C" { 
         /* * Python calls this to let us initialize our module */ 
       void initpython_sim(void) { 
               (void) Py_InitModule("python_sim", myModule_methods); 
       }
     }
    
     int main(int argc, char** argv)
     {
        string mod_name;
        cout << "###########################################" << endl;
        cout << "Running C++ code" << endl;
        cout << "###########################################" << endl;
    
        Py_SetProgramName(argv[0]);
        Py_Initialize();
        initpython_sim();
        const char* input_string = "00110100000010100100001000000000";
        c_python_intf(100000000000LL,input_string,5000000000LL);
        //Py_Main(argc, argv);
        Py_Finalize();
    
        return 0;
     }
    

    注意: - 代码已更新,以删除未阻止此处指定问题的冗余代码。因此,请忽略c_python_intf函数的输入参数。

    问题是由于python模块和C ++程序不在同一目录下,因此无法加载python模块。通过将python模块复制到编写C ++程序的同一目录中,它可以正常工作。

    如果python模块和C ++程序不在同一个目录中,如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

以下代码对我有用,

在Linux中使用:

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

在Windows中:

_putenv_s("PYTHONPATH", ".");

您可以用地址代替“。”,它表示活动路径

答案 1 :(得分:0)

PyImport_ImportModuleimport的直接对应项,并且接受模块的 name 而不是文件路径。如果要加载的模块不在sys.path上,则需要添加相应的sys.path条目。