首先,是的,我看过this和this,但是他们没有解决我的问题/错误。
<小时/> 所以,我试图从C / C ++调用Python函数,但是当调用PyImport_Import()
时它返回NULL
。
代码:
PyObject* fname = PyBytes_FromString("hello");
PyObject* module = PyImport_Import(fname);
其中hello
是我的hello.py
文件,与可执行文件位于同一目录中。我不知道我的错误在哪里,有人可以指点我吗?
答案 0 :(得分:10)
如果不了解有关系统设置方式和所涉及的Python文件内容的大量信息,则很难诊断出您的问题。让Python运行时告诉你出了什么问题要好得多。
PyObject * PyImport_ImportModule(const char * name)
...
返回对导入模块的新引用,或者返回NULL 并设置失败例外
(强调我的)
exception handling documentation表示您可以调用PyErr_Print()
将当前例外打印到stderr。
所以要付诸实践:
PyObject* fname = PyBytes_FromString("hello");
PyObject* module = PyImport_Import(fname);
if (module == nullptr)
{
PyErr_Print();
std::exit(1);
}
这至少可以让你开始搞清楚错误。
为了将来的方便,您可能希望创建自己的C ++异常类来包装Python错误(并避免使用诸如调用exit
之类的内容来编写代码。)
答案 1 :(得分:4)
我认为PyBytes_FromString
是PyString_From
的3.x替代品。
我错了。 PyUnicode_FromString
是正确的选择。
(感谢@wakjah给了我使用错误处理的提示)