我在我的主目录(/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模块打印任何变量值时,它会给出分段错误问题。
这里有几个问题: -
如果无法加载python模块,那么它是如何不给出任何编译错误的?
如何提供python模块名称以从我的主C ++程序的某个相对路径加载它?
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 ++程序不在同一个目录中,如何解决这个问题?
答案 0 :(得分:0)
以下代码对我有用,
在Linux中使用:
setenv("PYTHONPATH", ".", 1);
在Windows中:
_putenv_s("PYTHONPATH", ".");
您可以用地址代替“。”,它表示活动路径
答案 1 :(得分:0)
PyImport_ImportModule
是import
的直接对应项,并且接受模块的 name 而不是文件路径。如果要加载的模块不在sys.path
上,则需要添加相应的sys.path
条目。