python - 将 Python 嵌入到 C 中 - 无法从 python 模块导入方法
问题描述
我正在构建将使用 Python 插件的 C 应用程序。当尝试从另一个 Python 模块调用该方法时,该函数PyImport_ImportModule()
似乎正确导入了该模块,然后我尝试从该模块中获取该函数,PyObject_GetAttrString()
而我得到的只是空值。
我已经尝试使用PyModule_GetDict()
andPyDict_GetItemString()
从模块中获取方法,但效果是一样的。
主.c:
#include <stdio.h>
#include <python3.6/Python.h>
int main()
{
PyObject *arg, *pModule, *ret, *pFunc, *pValue, *pMethod, *pDict;
Py_Initialize();
PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyUnicode_FromString("."));
pModule = PyImport_ImportModule("test");
if(pModule == NULL)
{
perror("Can't open module");
}
pMethod = PyObject_GetAttrString(pModule, "myfun");
if(pMethod == NULL)
{
perror("Can't find method");
}
ret = PyEval_CallObject(pMethod, NULL);
if(ret == NULL)
{
perror("Couldn't call method");
}
PyArg_Parse(ret, "&d", pValue);
printf("&d \n", pValue);
Py_Finalize();
return 0;
}
测试.py:
def myfun():
c = 123 + 123
print('the result is: ', c)
myfun()
我得到的结果是:
Can't find method: Success
Segmentation fault (core dumped)
当我使用 gdb 调试器时,输出是:
pModule = (PyObject *) 0x7ffff5a96f48
pMethod = (PyObject *) 0x0
解决方案
您的程序没有工作,因为要导入的模块是test
内置模块,而不是您的test.py
脚本。这是因为您将当前目录附加到sys.path
,因此在列表中每个其他已经存在的路径之后都会对其进行检查。您应该将其插入到列表的开头,以便首先对其进行检查。
这将起作用:
PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys, "path");
PyList_Insert(path, 0, PyUnicode_FromString("."));
顺便说一句,您应该#include
将 Python 标头放在其他任何内容之前,如文档中所述:
注意:由于 Python 可能定义了一些影响某些系统上的标准头文件的预处理器定义,因此您必须在包含任何标准头文件之前包含 Python.h。
推荐阅读
- r - R plotly - showlegend = FALSE 不起作用
- android - For 语句仅在使用 Intent 传递数据时返回最后一个数据
- python - 为什么瓶子不能显示本地图像?
- java - JOOQ动态条件查询
- r - ggplot 显示所有 Y 轴值而不是校准
- java - 用交替字符串替换单个字符串
- javascript - Javascript 或 Jquery 事件触发器 - 如何在 javascript 将值传递到输入框时触发事件
- mysql - 在 EC2 上停止 MySql - CentOS
- lstm - batch_first 会影响 Pytorch LSTM 中的隐藏张量吗?
- flutter - 处理儿童水龙头