pythonc扩展
① python的字典怎么扩展成C呢拿什么数据结构接收100分 详细进来~
1、直接用PyObject。上策
2、转换成C++ STL的Map容器是直接对应的。中策
3、使用的是数据,而不是结构,只要能让中间的数据发挥作用,就没必要一样的结构,也就是转换成具体适合你那接下来C中应用的结构。比如只用到某几个键和某几个值。如果C中根本不应用,就回到1。中策
4、自己在C中实现这种字典。建立散列表或者红黑树表。或者最简单的两个一维数组,实现key[],value[]的一一对应。下策
② python编译C扩展报错
C和Python接口的地方应该没什么泄露。
关键是你现在是用C,那所有内存分配的地方都有可能泄露呗。 实在不行可以Jython,或者上面提到的Cython
③ python的c扩展可以包含多个mole吗
用__init__.py
④ 如何用wintc编译Python的c扩展
python
setup.py
build
--compiler=mingw32
执行后会在当前目录生成一个build目录及文件:
build\lib.win32-2.6\add.pyd
将add.pyd拷贝到当前目录,并写一个测试文件test.py,代码如下:
import
add
print
add.add(3,4)
执行一下,输出为7
OK,基本上就是如此了。
⑤ Python为什么能扩展
Python 具有高可扩展性,存在许多使用 C 语言或 Fortran 编写扩展的方法。必要时,Python 代码可以直接将这些扩展作为子例程来调用。这部分讨论用于构建扩展的一些主要编译器(绝对不是完整列表)。
相关推荐:《Python基础教程》
Cython
Cython(不同于 CPython)既是指一种语言,也是指一种编译器。Cython 语言是添加了 C 语言语法的 Python 语言的超集。Cython 可以在代码段或完整函数中显式释放 GIL。变量和类属性上的 C 类型声明以及对 C 函数的调用都使用 C 语法。其余部分代码则使用 Python 语法。通过这个混合的 Cython 代码,Cython 编译器可生成高效的 C 代码。任何定期优化的 C/C++ 编译器都可以编译此 C 代码,从而高度优化扩展的运行时代码,性能接近于原生的 C 代码性能。
Numba
Numba 是一个动态、即时 (JIT) 且可感知 NumPy 的 Python 编译器。Numba 使用 LLVM 编译器基础架构,生成优化的机器代码和从 Python 调用代码的包装器。与 Cython 不同,编码使用常规的 Python 语言。Numba 可读取来自装饰器中所嵌入注释的类型信息,并优化代码。对于使用 NumPy 数据结构的程序,比如数组以及许多数学函数,它可以实现与 C 或 Fortran 语言类似的性能。NumPy 对线性代数和矩阵函数使用硬件加速,利用 LAPACK 和 BLAS 提供额外加速,大大提升了性能,参见 IBM 博客文章C、Julia、Python、Numba 和 Cython 在 LU 因式分解方面的速度比较。
除 CPU 以外,Numba 还能够使用 GP-GPU 后端。Anaconda, Inc. 是 Python 某个主要发行版的幕后公司,该公司还开发了 Numba 和商业版的 Numba Pro。
Fortran to Python Interface Generator
Fortran to Python Interface Generator (F2Py) 起初为一个独立的程序包,现在包含在 NumPy 中。F2Py 支持 Python 调用以 Fortran 编写的数值例程,就好像它们是另一个 Python 模块一样。因为 Python 解释器无法理解 Fortran 源代码,所以 F2Py 以动态库文件格式将 Fortran 编译为本机代码,这是一种共享对象,包含具有 Python 模块接口的函数。因此,Python 可以直接将这些函数作为子例程来调用,以原生 Fortran 代码的速度和性能来执行。
⑥ 如何建立我的C扩展使用MinGW-W64在Python
安装Python的 windows扩展模块时发生Unable to find vcvarsall.bat的错误,解决方法如下: 首先安装MinGW,在MinGW的安装目录下找到bin的文件夹,找到mingw32-make.exe,复制一份更名为make.exe; 把MinGW的路径添加到环境变量path中,
⑦ Python的c语言扩展
C-Python,或者CPython,指C实现的Python虚拟机的基础API。最通用的Python就是是基于C实现的,它的底层API称为C-Python
API,所有Python代码的最终变成这些API以及数据结构的调用,才有了Python世界的精彩。
Cython,准确说Cython是单独的一门语言,专门用来写在Python里面import用的扩展库。实际上Cython的语法基本上跟Python一致,而Cython有专门的“编译器”先将
Cython代码转变成C(自动加入了一大堆的C-Python
API),然后使用C编译器编译出最终的Python可调用的模块。
GIL:Global
Interpreter
Lock,是Python虚拟机的多线程机制的核心机制,翻译为:全局解释器锁。其实Python线程是操作系统级别的线程,在不同平台有不同的底层实现(如win下就用win32_thread,
posix下就用pthread等),Python解释器为了使所有对象的操作是线程安全的,使用了一个全局锁(GIL)来同步所有的线程,所以造成“一个时刻只有一个Python线程运行”的伪线程假象。GIL是个颗粒度很大的锁,它的实现跟性能问题多年来也引起过争议,但到今天它还是经受起了考验,即使它让Python在多核平台下CPU得不到最大发挥。
⑧ python扩展的c代码在哪里写
在哪里写都可以啊,重要的是编译过程。给你介绍下编译过程吧。
在windows和linux下面,对C扩展的编译方法是不一样的,我们先来看windows版的。
我们用C实现一个简单的加法。
首先新建一个文件add.c,代码如下:
#include<Python.h>;
staticPyObject*add(PyObject*self,PyObject*args);
//一定声明为static,把他们限制在这个文件范围里。几乎所有的参数都是PyObject类型,在python,每个东西都是object。
staticPyObject*add(PyObject*self,PyObject*args)
{
intx=0;
inty=0;
intz=0;
if(!PyArg_ParseTuple(args,"i|i",&x,&y))
returnNULL;
/*第一个参数是self,这个是python用的,每个函数都要有。我们暂时不管。args是一个参数列表。她把所有的参数都整合成一个string。所以
我们需要从这个string里来解析我们的参数。PyArg_ParseTuple来完成这个任务。第一个参数是args,就是我们要转换的参数。第二个是格式符号。
“s”代表是个string。从args里提取一个参数就写"s",两个的话就写"s|s",如果是一个string,一个int,就写"s|i",和printf差不多。第三个
参数就是提取出来的参数放置的真正位置。必须传递这个参数的地址。对于add,他将提取两个参数。分别是x和y。*/
z=x+y;
returnPy_BuildValue("i",z);
/*调用完之后我们需要返回结果。这个结果是c的type或者是我们自己定义的类型。必须把他转换成PyObject,让python认识。这个用Py_BuildValue
来完成。他是PyArg_ParseTuple的逆过程。他的第一个参数和PyArg_ParseTuple的第二个参数一样,是个格式化符号。第三个参数
是我们需要转换的参数。Py_BuildValue会把所有的返回只组装成一个tutple给python。*/
}
staticPyMethodDefaddMethods[]=
{
{"add",add,METH_VARARGS,"Executeashellcommand."},
{NULL,NULL,0,NULL}
};
/*这个是一个c的结构。他来完成一个映射。我们需要把我们扩展的函数都映射到这个表里。表的第一个字段是python真正认识的。是python里的方法名字。第二个字段是python里的这个方法名字的具体实现的函数名。在python里调用add,真正执行的是用c写的add函数。第三个字段是METH_VARARGS,他告诉python,add是调用c函数来实现的。第四个字段是这个函数的说明。如果你在python里来help这个函数,将显示这个说明。相当于在python里的函数的文档说明。*/
PyMODINIT_FUNCinitadd()
{
Py_InitMole("add",addMethods);
}
/*注意,这个函数的名字不能改动。必须是init+模块名字。我们的模块名字是add。所以这个函数是initadd()。
这样python在导入add的模块时候,才会找到这个函数,并调用。这个函数调用Py_InitMole来将模块名字和映射表结合在一起。他表示,add这个模块使用addMethods这个映射表。python应该这样导入我们的mole的.*/
新建一个setup.py,内容如下:
fromdistutils.coreimportsetup,Extension
mole1=Extension('add',sources=['add.c'])
setup(name='PackageName',version='1.0',description='Thisisademopackage',ext_moles=[mole1])
组建:(由于我的机器上装了mingw,所以指定了mingw32。默认的编译器是vs2008。参考:
python setup.py build--compiler=mingw32
执行后会在当前目录生成一个build目录及文件:
buildlib.win32-2.6add.pyd
将add.pyd拷贝到当前目录,并写一个测试文件test.py,代码如下:
import add
print add.add(3,4)
执行一下,输出为7
OK,基本上就是如此了。
在linux下的话,会有少许不同.
即直接用makefile将add.c编译成.so,python可以直接import,makefile代码如下:
PYLIB=/usr/bin
PYINC=/usr/include/python2.6
all:add.c
gccadd.c-g-I$(PYINC)-shared-L$(PYLIB)-lpython2.6-oadd.so
clean:
rm-fadd.so
用同样的测试代码,可以测试通过。
⑨ 求,Python的C扩展程序中传递参数为结构体,怎么传递
况如下:
打算从python发一个tcp数据包给远程服务器,数据的主体是一个c语言的
struct
(较大,size
为1402)。由于这个struct太复杂,故不打算在python
处对其重新定义,目前的想法是用python调用一个c语言的模块,在这个模块中定义这个struct,并设置好数据后,将其struct传回python中,再打包传送服务器。
但是不知道如何将这个struct
变量从c语言
传入python中。尝试用py_buildvalue函数,以py_buildvalue("p",&interface_setup)
//interface_setup为结构体变量
传递,
但是几次都得到运行时错误:
systemerror:
bad
format
char
passed
to
pybuildvaule。
⑩ python 可扩展主要体现
就算你的项目中有大量的Python代码,你也依旧可以有条不紊地通过将其分离为多个文件或模块加以组织管理。而且你可以从一个模块中选取代码,而从另一个模块中读取属性。更棒的是,对于所有模块,Python的访问语法都是相同的。不管这个模块是Python标准库中的还是你一分钟之前创造的,哪怕是你用其他语言写的扩展都没问题!借助这些特点,你会感觉自己根据需要“扩展”了这门语言,而且你已经这么做了。
代码中的瓶颈,可能是在性能分析中总排在前面的那些热门或者一些特别强调性能的地方,可以作为Python扩展用C重写。需要重申的是,这些接口和纯Python模块的接口是一模一样的,乃至代码和对象的访问方法也是如出一辙的。唯一不同的是,这些代码为性能带来了显着的提升。自然,这全部取决你的应用程序以及它对资源的需求情况。很多时候,使用编译型代码重写程序的瓶颈部分绝对是益处多多的,因为它能明显提升整体性能。
程序设计语言中的这种可扩展性使得工程师能够灵活附加或定制工具,缩短开发周期。虽然像C、C++乃至Java等主流第三代语言(3GL)都拥有该特性,但是这么容易地使用C编写扩展确实是Python的优势。此外,还有像PyRex这样的工具,允许C和Python混合编程,使编写扩展更加轻而易举,因为它会把所有的代码都转换成C语言代码。
因为Python的标准实现是使用C语言完成的(也就是CPython),所以要使用C和C++编写Python扩展。Python 的Java实现被称作Jython,要使用Java编写其扩展。最后,还有IronPython,这是针对.NET或Mono平台的C#实现。你可以使用C#或者VB.Net扩展IronPython.