导航:首页 > 编程语言 > windowspythonc扩展

windowspythonc扩展

发布时间:2023-03-24 23:49:23

python的字典怎么扩展成C呢拿什么数据结构接收100分 详细进来~

1、直接用PyObject。上策
2、转换成C++ STL的Map容器是直接对应的。中策
3、使用的是数据,而不是结构,只要能让中间的数据发挥作用,就没必要一样的结构,也就是转换成具体适合你那接下来C中应用的结构。比如只用到某几个键和某几个值。如果C中根本不应用,就回到1。中策
4、自己在C中实现这种字典。建立散列表或者红黑树表。或者最简单的两个一维数组,实现key[],value[]的一一对应。下策

⑵ python 扩展和嵌入c/c++ 的方法有哪些 一般用哪个

swig,pyrex,直接写代码、写DLL用ctypes模块来调用。

⑶ python怎么作为c语言的扩展

1.环境配置,简高python3.2装好,编译器我直接用的devcpp的编译器(原因是直接安装就可以,其它的编译器我还不会用),将devcpp的bin目录添加到环境变量path中。
2.准备好your_mole.c文件,这是你自己的C语言写的扩展程序,确保你的your_mole.c符合python和C的接口要求。
3.python提供了distutils模块用来方便地将c文件转变成pyd文件,也是笔者比较推荐的方法。准备好your_mole.c文件后,在同一目录下创建steup.py文件,文件内容如下:

from distutils.core import setup, Extension

mole1 = Extension('your_mole_name',
sources = ['demo.c'])

setup (name = 'PackageName',
version = '1.0',
description = 'This is a demo package',
ext_moles = [mole1])
注意'your_mole_name'要枝拦跟C文件中PyInit_mole函数的'mole'一样,否则在后续的步骤中会出错。
4.建立steup.bat文件,内容只有两行:
python.exe setup.py build -c mingw32
pause
5.运行steup.bat文件。
6.如果没有错误,在build\lib.win32-3.2下找到生成的pyd文件,放置到PYTHONPATH的拦搭尺目录中即可被import调用,到此大功告成。注意,python寻找pyd文件不是在sys.path中找,而是在PYTHONPATH指定的目录中找。

⑷ 如何建立我的C扩展使用MinGW-W64在Python

安装Python的 windows扩展模块时发生Unable to find vcvarsall.bat的错误,解决方棚掘法竖和纳如下余没: 首先安装MinGW,在MinGW的安装目录下找到bin的文件夹,找到mingw32-make.exe,复制一份更名为make.exe; 把MinGW的路径添加到环境变量path中,比如MinGW...

⑸ 如何让python调用C和C++代码

要搞明白如何让python调用C/C++代码(也就是写python的extension),你需要征服手册中的<<Extending && embedding>>厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他书籍,最终在<<Python Programming On Win32>>书中找到了教程。 1. 首先要明白的是,所谓的python扩展(也就是你提供给python的c/c++代码,不一定是c/c++代码,可以是其他语言写的代码)是一个dll,并且这个dll放在本机python安装目录下的DLLs目录下(譬如我机器上的路径是:F:/Program Files/Python25/DLLs),假如我们接下来要写的扩展mole名为mb,python调用的代码为:import mbmb.showMsg("Python's really amazing, I kindda love it!") 2. 搭建环境,我们要使用python提供的c头文件和lib库来进行扩展的开发。 在vs 2005下点击菜单 "工具"->"选项", 打开选项对话框,选择"项目和解决方案->VC++目录", 然后在右边"显示以下内容的目录"得comboBox上选择"包含文件”,添加python的include目录(我的机器上是"F:/Program Files/Python25/include"),然后选择库文件,添加python的libs目录(我的机器上是"F:/Program Files/Python25/libs")。 既然扩展是一个dll,接下来我们要建立一个“动态链接库”工程,然后开始写代码: #include <python.h> //python.h是包含python一些定义的头文件,在python的include目录下/*我的python版本是2.5, 因为安装python后它没提供debug下的lib库文件,因此你必须生成release版的dll, 想要生成dll版本的,你要到python官网上自己去下载python源代码,当然你可以继续生成release版本的dll,但dll中包含调试信息*/#pragma comment(lib, "python25.lib")//先不管static PyObject* mb_showMsg(PyObject* self, PyObject *args);/*如果你的扩展是mb,那么必须实现一个initmb函数,并且从dll中导出这个函数,但我们在python中调用import mb时,python会去dll里去调用 extern "C" __declspec(dllexport) void initmb(){/*当调用mb.showMsg("Python's really amazing, I kindda love it!")时, 相当于你告诉python我有一个showMsg函数,我们怎么告诉python去调用我们dll里的mb_showMsg函数呢?技巧就是下面的方式,定义一个字典数据结构,key => showMsg, value =>mb_showMsg,METH_VARARGS是函数调用方式,仔细查手册吧*/static PyMethodDef mbMethods[] = { {"showMsg", mb_showMsg, METH_VARARGS}, {NULL, NULL, NULL} /*sentinel,哨兵,用来标识结束*/};//告诉python我们的模块名叫mb, 模块包含的函数都在mbMethods字典里 PyObject *m = Py_InitMole("mb", mbMethods);}/*接下来实现核心功能showMsg*///第一个self参数我们用不着,具体查手册,第二个参数是python传给我们的参数,它是一个python的参数tuple static PyObject* mb_showMsg(PyObject* self, PyObject *args){//我们的showMsg函数需要的是一个字符串参数 const char* msg = NULL;/*调用特殊参数解码python传递给我们的参数,s是string,我们传递接收参数的变量地址, 如果你的功能函数需要两个参数,在PyArg_parseTuple后面继续添加接受参数的变量地址, 这个函数的原型是类似printf的不定参数的形式 PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...);*/if (!PyArg_ParseTuple(args, "s", &msg)) return NULL;//调用MBint r = ::MessageBox(NULL, "hello", "Caption:Form C mole", MB_ICONINFORMATION | MB_OK);//返回值return Py_BuildValue("i", r);}将上面这段混杂着大量注释的代码拷贝到你的编辑器里,然后编译生成mb.dll,修改后缀成mb.pyd,然后拷贝到python的DLLs目录下,打开idle(python的交互程序),写入代码:import mbmb.showMsg("Python's really amazing, I kindda love it!")

⑹ 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

用同样的测试代码,可以测试通过。

⑺ C程序用Python做插件该怎么实现

Python 是一种用于快速开发软件的编程语言,它的语法比较简单,易于掌握,但存在执行速度慢的问题,并且在处理某些问题时存在不足,如对计算机硬件系统的访问,对媒体文件的访问等。而作为软件开发的传统编程语言 C 语言,却能在这些问题上很好地弥补 Python 语言的不足。因此,本文通过实例研究如何在 Python 程序中整合既有的 C 语言模块,包括用 C 语言编写的源程序和动态链接库等,从而充分发挥 Python 语言和 C 语言各自的优势。
概览

背景知识介绍
Python 语言的特点

Python 作为一门程序开发语言,被越来越多地运用到快速程序开发。Python 是一种解释型的,互动的,面向对象的编程语言,它包含了模块化的操作,异常处理,动态资料形态,以及类型的使用。它的语法表达优美易读,具有很多优秀的脚本语言的特点:解释的,面向对象的,内建的高级数据结构,支持模块和包,支持多种平台,可扩展。而且它还支持交互式方式运行,图形方式运行。它拥有众多的编程界面支持各种操作系统平台以及众多的各类函数库,利用 C 和 C++ 可以对它进行扩充。
C 语言的特点

C 语言作为最受人们欢迎的语言之一,有广泛的发展基础。简洁紧凑、灵活方便,功能强大是其特点。另外,C 语言是一门中级语言。它把高级语言的基本结构和语句与低级语言的实用性结合起来。由于可以直接访问物理地址,可以方便的对硬件进行操作。因此,很多的系统软件都是由 C 语言编写。
Python 语言与 C 语言的交互

为了节省软件开发成本,软件开发人员希望能够缩短的软件的开发时间,希望能够在短时间内开发出稳定的产品。Python 功能强大,简单易用,能够快速开发应用软件。但是由于 Python 自身执行速度的局限性,对性能要求比较高的模块需要使用效率更高的程序语言进行开发,例如 C 语言,系统的其他模块运用 Python 进行快速开发,最后将 C 语言开发的模块与 Python 开发的模块进行整合。在此背景下,基于 Python 语言与 C 语言的各自特点,用 C 语言来扩展现有的 Python 程序,显得很有意义。本文首先介绍几种常用的整合 Python 程序与 C 语言程序的方法,最后给出相应的实例。
利用 ctypes 模块整合 Python 程序和 C 程序
ctypes 模块

ctypes 是 Python 的一个标准模块,它包含在 Python2.3 及以上的版本里。ctypes 是一个 Python 的高级外部函数接口,它使得 Python 程序可以调用 C 语言编译的静态链接库和动态链接库。运用 ctypes 模块,能够在 Python 源程序中创建,访问和操作简单的或复杂的 C 语言数据类型。最为重要的是 ctypes 模块能够在多个平台上工作,包括 Windows,Windows CE,Mac OS X,Linux,Solaris,FreeBSD,OpenBSD。

接下来通过几个简单的例子来看一下 ctypes 模块如何整合 Python 程序和 C 程序。
源代码层面上的整合

利用 Python 本身提供的 ctypes 模块可以使 Python 语言和 C 语言在源代码层面上进行整合。本节介绍了如何通过使用 ctypes 库,在 Python 程序中可以定义类似 C 语言的变量。

下表列出了 ctypes 变量类型,C 语言变量类型和 Python 语言变量类型之间的关系:
表 1. ctypes,c 语言和 Python 语言变量类型关系

⑻ 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扩展报错

C和Python接口的地方应该没什么泄露。
关键是你现在是用C,那所有内存分配的地方都有可能泄露呗。 实在不行可以Jython,或者上面提到的Cython

⑽ python文件是以什么为扩展名的文件

..py - 常规脚本
.py3 - Python3脚本(Python3脚本通常以.py而不是.py3结尾,很少使用)
.pyc - 编译的脚本(字节码)
.pyo - 优化的pyc字节码文件(从Python3.5开始,Python将只使用pyc而不是pyo和pyc)
.pyw - 用pythonw.exe执行的Windows的Python脚本
.pyx - 将Cython src转换为C/C++
.pyd - 作为Windows DLL创建的Python脚本
.pxd - 相当于C/C++头文件的Cython脚本
.pyi - MyPy存根
.pyi - 存根文件(PEP 484)
.pyz - Python脚本归档(PEP 441)(这是一个包含标准Python脚本头之后的二进制形式的压缩Python脚本(ZIP)的脚本)
.pywz - 用于MS-Windows的Python脚本归档(PEP 441)(这是一个包含标准Python脚本头之后的二进制形式的压缩Python脚本(ZIP)的脚本)

阅读全文

与windowspythonc扩展相关的资料

热点内容
2019程序员笔记本 浏览:476
武大小孩子厉害的电影有哪些 浏览:35
找一个可以看的网址 浏览:79
四个字的国外电影,小孩儿 浏览:411
推荐看片网站 浏览:652
主角叫林飞的小说是什么 浏览:683
闲置服务器能干什么工作 浏览:949
asdr q-2299123 浏览:987
中国最大尺度古装电影 浏览:695
电影和电视播放器 浏览:113
樱桃小说by小花喵 浏览:514
英国看片网站叫什么名字 浏览:676
法兰克plc编程软件 浏览:359
怎么看pdf的字体 浏览:634
和李采潭合作的女演员有哪些 浏览:430
日本那部电影病娇男主要当女主的狗是校园电影 浏览:210
抗日战争片400部 浏览:730
编程可以赚钱吗 浏览:729
eclipseandroid建立工程 浏览:733
大胸女友主演 浏览:276