如何在Python中处理来自C的PyObject *
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何在Python中处理来自C的PyObject *,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1524字,纯文字阅读大概需要3分钟。
内容图文
我在C中创建了DLL,导出函数返回PyObject *.然后我使用ctypes在Python中导入DLL.现在,我怎样才能得到真正的PyObject?
这是c代码的一部分:
PyObject* _stdcall getList(){
PyObject * PList = NULL;
PyObject * PItem = NULL;
PList = PyList_New(10);
vector <int> intVector;
int i;
for(int i=0;i<10;i++){
intVector.push_back(i);
}
for(vector<int>::const_iterator it=intVector.begin();it<intVector.end();it++){
PItem = Py_BuildValue("i", &it);
PyList_Append(PList, PItem);
}
return PList;
}
和一些python代码:
dll = ctypes.windll.LoadLibrary(DllPath)
PList = dll.getList()
*我想获得包含1,2,3,4 … 10的真正的python列表? *
我清楚吗?谢谢你
解决方法:
您的代码有很多问题,有些修改:
#include <Python.h>
#include <vector>
extern "C" PyObject* _stdcall getList(){
PyObject *PList = PyList_New(0);
std::vector <int> intVector;
std::vector<int>::const_iterator it;
for(int i = 0 ; i < 10 ; i++){
intVector.push_back(i);
}
for(it = intVector.begin(); it != intVector.end() ; it++ ){
PyList_Append(PList, Py_BuildValue("i", *it));
}
return PList;
}
编译它:
> g++ -Wall -shared lib.cpp -I \Python27\include -L \Python27\libs -lpython27 -o lib.dll -Wl,--add-stdcall-alias
现在您可以将其作为任何函数加载,并将getList返回类型设置为py_object:
import ctypes
lib = ctypes.WinDLL('lib.dll')
getList = lib.getList
getList.argtypes = None
getList.restype = ctypes.py_object
getList()
测试一下:
>>> import ctypes
>>>
>>> lib = ctypes.WinDLL('lib.dll')
>>>
>>> getList = lib.getList
>>> getList.argtypes = None
>>> getList.restype = ctypes.py_object
>>> getList()
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
>>>
内容总结
以上是互联网集市为您收集整理的如何在Python中处理来自C的PyObject *全部内容,希望文章能够帮你解决如何在Python中处理来自C的PyObject *所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。