cpython混合
C语言设计一个完整的可执行文件,然后python通过subprocess来执行该可执行文件,本质上是fork+execve。
C语言使用popen/system或者直接以系统调用级fork+exec来运行python程序也是一种混编的手段了。
❷ CPython是什么PyPy是什么Python和这两个东西有什么关系
CPython:是用C语言实现Pyhon,是目前应用最广泛的解释器。最新的语言特性都是在这个上面先实现,基本包含了所有第三方库支持,但是CPython有几个缺陷,一是全局锁使Python在多线程效能上表现不佳,二是CPython无法支持JIT(即时编译),导致其执行速度不及java和Javascipt等语言。于是出现了Pypy。
Pypy:是用Python自身实现的解释器。针对CPython的缺点进行了各方面的改良,性能得到很大的提升。最重要的一点就是Pypy集成了JIT。但是,Pypy无法支持官方的C/Python API,导致无法使用例如Numpy,Scipy等重要的第三方库。这也是现在Pypy没有被广泛使用的原因吧。
而PyPy与CPython的不同在于,别的一些python实现如CPython是使用解释执行的方式,这样的实现方式在性能上是很凄惨的。而PyPy使用了JIT(即时编译)技术,在性能上得到了提升。
❸ 为什么有的网站打开后域名后多个/index.html
index的意思是指示索引,所以多指网站的主页。
下面是主流网页编程语言:
CGI
CGI(common Gateway Interface,公共网关接口)。严格意义上来说并不算一种网页编程语言。CGI是信息服务器主机对外信息服务的标准接口,为了向客户端提供动态信息而制定。通过专门编写CGI脚本程序(在CGI控制下运行得程序,通常称为CGI程序),不仅可以生成静态的内容,而且可以生成完全无法预见的 动态的内容!比如雅虎、搜狐等搜索引擎提供的强大搜索功能便是利用CGI实现的。CGI脚本程序可以用C、C++等语言在多种平台上进行开发。无需太大修改就可以从一个平台移植到另一个平台上运行,具有很好的兼容性。
ASP与ASP.NET
ASP是微软公司推出的意图取代CGI的新技术。通过它,用户可以使用几乎所有的开发工具来创建和运行交互式的动态网页,如返馈表单的信息收集处理、文件上传与下载、聊天室、论坛等等,实现了CGI程序的功能介是又比CGI简单,而且容易学习。由于ASP使用基于开放设计环境的Active X技术,用户可以自己定义和制作组件加入其中,使自己的动态网页具有几乎无限的扩充能力。它还可利用ADO(Active Data Object,微软的一种新的数据访问模型)方便地访问数据库,能很好地对数据进行处理。借WINDOWS 东风,ASP得到了长足的发展。
php
PHP,一个嵌套的缩写名称,是英文“超级文本预处理语言”(PHP:Hypertext Preprocessor)的缩写。PHP 是一种 HTML 内嵌式的语言,PHP与微软的ASP颇有几分相似,都是一种在服务器端执行的“嵌入HTML文档的脚本语言”,语言的风格有类似于C语言,现在被很多的网站编程人员广泛的运用。PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。它可以比 CGI 或者 Perl 更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;与同样是嵌入HTML文档的脚本语言JavaScript相比,PHP在服务器端执行,成 分利用了服务器的性能;PHP执行引擎还会将用户经常访问的PHP程序驻留在内存中,其他用户在一次访问这个程序时就不需要诚信编译程序了,只要直接执行内存中的代码就可以了,这也是PHP高效率的体现之一。PHP具有非常强大的功能,所有的CGI或者JavaScript的功能PHP都能实现,而且支持几乎所有流行的数据库以及操作系统。
Script
脚本语言是介于HTML(HyperText Markup Language,超文本标示语言)和Java、C++和Visual Basic之类的编程语言之间的语言。它的语法和规则没有可编译的编程语言那样严格和复杂。传统的HTML是静态的,为增强网页的动态功能,一些厂商先后推出了自己的Script脚本语言,其中Netscape推出了JavaScript(for客户端和 for服务端两种),微软则推出了VBScript和ASP两种,用于服务器端和客户端程序的编写。
JavaScript
JavaScript是一种基于对象(Object)和事件驱动(Event Driven)并具有安全性能的脚本语言。它与Java不同:JavaScript主要用于HTML的页面,脚本嵌入在HTML的源码中;而Java是一个独立的、完整的编程语言,既可以在Web中应用,也可以用于与Web网无关的情况。另外,JavaS cript编写的程序不必在运行前编译,它们可以直接写入Web页面中并由调用它们的浏览器来解释执行。这样,一些基本交互作用就不用在服务器端完成,提高了客户端的响应时间。
VBScript
为了适应Internet上的应用,Microsoft公司把用于应用程序描述的Visual Basic语言压缩成一个更合理的子集,称为Visual Basic Scripting Edition,简称VBScript。它也是一种HTML嵌入脚本语言,具有易学易用等特点。如果你已了解Visual Basic或Visual Basic for Applications,就会很快熟悉VBScript。Microsoft公司将VBScript语言作为实施其ActiveX脚本化的最佳选择,用户可以采用小的相互操作的部件一起来完成工作,使得应用程序的功能列加强大。
Perl
Perl是Practical Extraction and Report Language(实用摘录和报告语言)的缩写,由Larry Wall于1986年开发成功。当初的目的主要是Unix环境下从多个文本文件中产生报表,后来成为许多程序员工具箱中最受欢迎的工具,其发展速度和Unix内核的成长速度相仿。现在Perl已经发展到5.0版本,并移植到了各种平台。
Python
是一种跨平台的开发语言,它可以运行在已知的各种操作系统之上,包括windows、Mac OS、Unix、BSD、Palm等。python是一种支持扩展的开发语言,主要的扩展变种有CPython、JPython、PerlPython。它们分别使用C、Java、Perl做它的扩展接口基础环境的。更准确的说,Python也可以是一种 跨语言的语言。
ColdFusion
美国的一对兄弟allire,在为自己的客户解决数据库访问的问题时,感觉到了cgi程序在编写和维护上的难度是不能容忍的困难。于是,具有计算机天赋的Jeremy Allire便在1995年编写了一种快速响应且易于编写的动态脚本语言,叫做coldfusion,一经推出,便震撼整个网络行业。之后,兄弟俩看到了coldfusion的发展前途,便成立了Allire公司(后来被macromedia收购)。之后 的几年,全球500强中的一半都采用了coldfusion来解决公司不同情况的问题。通过不断的版本修改和开发者的不断壮大,Coldfusion后来发展成为业界知名的企业级解决方案的开发首选。现在,为了产品线的统一,为了工业标准的统一,为了完全 兼容Java平台,Macromedia发布了ColdfusionMX。而众位以前经常看到的Neo这个词则是macromedia对于使用新一代coldfusion开发行业解决方案的编码名称。
Java
Java是一个由Sun公司开发而成的新一代编程语言。是近年来很流行的一种网络编程语言,它由C语言发展而来,是完全面向对象的语言。在与网络的融合中,已显现出它的强大生命力和广阔的前景。Java的语法简练,学习和掌握比较容易,使用它可在各式各样不同种机器、不同种操作平台的网络环境中开发软件。Java正在逐步成为Internet应用的主要开发语言。它彻底改变了应用软件的开发模式,带来了自PC机以来又一次技术革命,为迅速发展的信息世界增添了新的活力。
您在编程实践中是否常常碰到要为不同的系统平台重复编程(比如为Windows系统设计一套程序,UNIX系统设计一套程序)? Sun Microsystems公司的Java语言以其"一次编程,到处执行"的技术优势,广泛应用于Internet计算机环境下的编程应用,避免您针对不同的系统平台重复编程,减少您的企业的开发成本。
JSP
JSP(Java Server Pages,Java服务器页面)是在Sun Microsystems公司的倡导下,由许多公司共同参与建立的一种新的动态网页技术标准。它在动态网页的建设方面具有强大而特殊的功能。Sun公司应用组建“Java社团”的思想开发JSP技术。在开发JSP规范的过程中,Sun公司与许多主要的Web服务器、Web应用服务器和开发工具供应商,以及各种各样富有经验的开发团体进行合作,找到了一种适合于应用和页面开发人员的开发方法,它具有极佳的可移植性和易用性。针对JSP的产品,Sun公司授权予工具提供商(如Macromedia)、结盟公司(如Apache,Netscape)、最终用户、协作商及其他人。最近,Sun公司将最新版本的JSP和Java Servlet(JSP 1.1,Java Servlet 2.2)的源代码发放给Apache,以求JSP和Apache紧密结合、共同发展。Apache,Sun公司和许多其他的公司及个人公开成立的咨询机构更能方便任何公司和个人免费取得信息。
XML
XML开发者源于SGML的设计和应用者. 他们已经在SGML上投入了大量精力,但他们却发现SGML 并没有完全发挥它的作用.他们当然有其充分的理由.我们可以列举以下几个重要方面给大家.在这些方面SGML 带来的影响可以说是一场革命. SGML (通用标记语言标准ISO 8879:1986)是HTML的前身技术.它是文件和文件中信息的构成主体. SGML与HTML不同.它允许用户扩展tag集合, 允许用户建立一定的规则. SGML所产生的tag 集合是用来描叙信息段特征的.而HTML仅仅只是一个tag集合.所以我们可以说HTML是一个SGML的子集. 早在Seattle会议之前,Bosak和一些精心挑选的SGML结构信息专家就已向W3C提出了“网络上的SGML”计划. W3C支持并赞助了他们的努力. 工作于1996年7月正式开始起动. 工作的早期,有较大的阻力.因为也存在反对SGML的人.一些制定XML标准的W3C代表甚至声称“网络上的SGML”是不可能实现.工作组(原称“SGML编辑审议委员会”)并未退缩.他们打算让SGML以全新的面目出现在网上,给SGML以全新的面貌,故给它命名为“可扩展标识语言”,即XML.
一般来讲,网站基本上由FrontPage和Dreamweaver这两种工具软件架设的
❹ 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.
❺ 为什么使用Python,Python应用场景 特点
python一般认为是脚本语言,或者说是动态语言,速度慢肯定是所有解释性语言的缺点了,除此之外,python的多线程无法在多核上运行肯定也
是需要解决的问题,不过它最大的优点就是敏捷,堪称敏捷开发的典范,适合的场合分两种:专业人士来做一些有意思的事情,比如写一些很有意思的脚本啊(黑客
必学的语言之一);非专业人士用来做一些普通的事情,比如搭个自己的网站(django)或者一般的科学计算、格式转换等等。业界用python做web
开发其实蛮少,不过也有,web框架比较好用的就是django,比较适合快速开发程序员至少得会c语言吧,剩下的看需要。语言无所谓。只要人牛叉,什么
语言都能写出牛叉的程序。
-----
1. 支持OOP编程
从根本上讲Python仍是一种面向对象的语言,支持多态、继承等高级概念,在Python里使用OOP十分容易
没有C++、Java那样复杂,但不必做Python下OOp高手,够用即可。
2. 免费Python的使用是完全免费的,您可以从网络上免费下载、安装使用,
Python上的其他程序包,也可下载安装使用。
Python的免费的同时又有很多的的社区对用户的提问提出快速的技术支持,学习和使用Python技术不再是一个人在战斗!
3. 可移植性
Python的实现是用ansi c编写的,可以运行在目前所有主流平台上,手机、pad上均可运行Python程序,其下的程序包也具有可移植性。
4. 功能强大
从特性的观点上看,Python是一个混合体,他丰富的工具集使得他介于传统的脚本语言和系统语言之间。
------
python好不好,还在于自己的积累与感觉。如果你积累的多,游刃有余,会觉着它很好。从一般情况来看python是脚本语言之王,十年前是这样,十年后还是这样。
胶水是指,python借助C语言接口,几乎可以驱动所有已知的软件,模块。 只要我们用到的,通常你都能找到一个开源的库。安装后就可以驱动它。无论是数据库,网络,互联网,图形,游戏,科学计算,GUI,OA,自动控制,甚至宇航员都在用。
python通常不作为工程语言出现。就是正规的软件生产不使用它。主要用java, c#, xml, c。至于为什么,这是软件工程的需要。python不具有完整的语法检查。
python并不为特定目的而产生。虽然它更适用于系统维护。不过它就是一个通用的脚本语言。
从个人感觉来说,微软件东西,非常好,省心,一流的技术理念,开发工具是全世界最好的(没有之一)。不过,因为它只限于微软的平台,所以范围上大大
打了折扣。
世界上最流行的服务器还是unix和linux。而不是windows。桌面操作系统最流行的是windows。不过在所有的平台上都有C语言,大部分平
台,甚至手机平台都有python语言和它的执行环境。这是其它的所有语言,包括java几乎都很难做到的。
python严格说叫CPython,与C/c++有天然的融合性。这也是python强大的原因之一。在windows环境下可以使用
ironpython,这个版本与vc可以结合的比较好。其它的平台可以使用eclipse,不过最好还是直接使用普通的文本编辑器。比较推荐的一个编辑
器是sublime text2, geany, vi等。
python图形化编程不难。当然MFC也不难。我不认为MFC有多难。其实学习起来只是略难,但是这不是一个数量级的。MFC可以生产出非常强劲的界面。而python界面多属于简单的。
虚拟机可以跑linux,配置好就可以。也可以独立安装一个linux。也可以直接在windows下学习python。没有太多区别。建议你买一个200多元的树莓派,很好玩。安装的是linux操作系统。
IDLE是我初学,甚至几年中用得最多的。后来有了sublime才基本上不用它。idle只有一个缺点,就是有时候程序大了,输入键盘会有感觉延迟。
---
python应用的很多的呀,web的比如豆瓣,还有非常多的网页游戏的后端。我知道的都是作为后台服务,无论开发速度还是调试之类的都很好。前端的应用产品虽然python可以实现,但是在GUI方面的开发效率还是没有VS或者XCode快。
----
如果说c是剑,c++是刀,java是枪的话,python就是飞刀,学精了可以成为李寻欢那样的高手,当作常规武器用,不过绝大多数人只能把飞刀当作暗器,在某些特定场合,出奇制胜
----
做web开发肯定首选php 数据挖掘首选python
--
Python的web框架很多,比如Django,webpy等 - webpy
❻ python与c++混合编程如何入门
派桑和c/c++实际上是不同的工具,一个是斧头,一个是菜刀,各有各的用途。非要把让菜刀能砍柴,让斧头能切菜,这种努力有无必要,值得考虑。
派桑常用剧本,噜苏,速度慢,不严谨,但有它的便利,例如它有 list, tuple, 之类的东西。
混合编程 常用于 提高 派桑 速度。
常用 方法 是(1)包含 Python.h 文件头 (2)定义 派桑 的 各种对象 为 各种 c 结构
(3)派桑 的 各种对象用指针,名字用 Py 或 _Py大头 动态分配 在 heap (4)用函数跟踪统计 各种对象结构 的个数变化,即时 释放内存(5)及时处理 派桑 exception
(6) 输出为派桑的数据格式。
我没有合起来用过,不过基本套路如此。
❼ 如何实现 C/C++ 与 Python 的通信
属于混合编程的问题。较全面的介绍一下,不仅限于题主提出的问题。
以下讨论中,Python指它的标准实现,即CPython(虽然不是很严格)
本文分4个部分
C/C++ 调用 Python (基础篇)— 仅讨论Python官方提供的实现方式
Python 调用 C/C++ (基础篇)— 仅讨论Python官方提供的实现方式
C/C++ 调用 Python (高级篇)— 使用 Cython
Python 调用 C/C++ (高级篇)— 使用 SWIG
练习本文中的例子,需要搭建Python扩展开发环境。具体细节见搭建Python扩展开发环境 - 蛇之魅惑 - 知乎专栏
1 C/C++ 调用 Python(基础篇)
Python 本身就是一个C库。你所看到的可执行体python只不过是个stub。真正的python实体在动态链接库里实现,在Windows平台上,这个文件位于 %SystemRoot%\System32\python27.dll。
你也可以在自己的程序中调用Python,看起来非常容易:
//my_python.c
#include <Python.h>
int main(int argc, char *argv[])
{
Py_SetProgramName(argv[0]);
Py_Initialize();
PyRun_SimpleString("print 'Hello Python!'\n");
Py_Finalize();
return 0;
}
在Windows平台下,打开Visual Studio命令提示符,编译命令为
cl my_python.c -IC:\Python27\include C:\Python27\libs\python27.lib
在Linux下编译命令为
gcc my_python.c -o my_python -I/usr/include/python2.7/ -lpython2.7
在Mac OS X 下的编译命令同上
产生可执行文件后,直接运行,结果为输出
Hello Python!
Python库函数PyRun_SimpleString可以执行字符串形式的Python代码。
虽然非常简单,但这段代码除了能用C语言动态生成一些Python代码之外,并没有什么用处。我们需要的是C语言的数据结构能够和Python交互。
下面举个例子,比如说,有一天我们用Python写了一个功能特别强大的函数:
def great_function(a):
return a + 1
接下来要把它包装成C语言的函数。我们期待的C语言的对应函数应该是这样的:
int great_function_from_python(int a) {
int res;
// some magic
return res;
}
首先,复用Python模块得做‘import’,这里也不例外。所以我们把great_function放到一个mole里,比如说,这个mole名字叫 great_mole.py
接下来就要用C来调用Python了,完整的代码如下:
#include <Python.h>
int great_function_from_python(int a) {
int res;
PyObject *pMole,*pFunc;
PyObject *pArgs, *pValue;
/* import */
pMole = PyImport_Import(PyString_FromString("great_mole"));
/* great_mole.great_function */
pFunc = PyObject_GetAttrString(pMole, "great_function");
/* build args */
pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs,0, PyInt_FromLong(a));
/* call */
pValue = PyObject_CallObject(pFunc, pArgs);
res = PyInt_AsLong(pValue);
return res;
}
从上述代码可以窥见Python内部运行的方式:
所有Python元素,mole、function、tuple、string等等,实际上都是PyObject。C语言里操纵它们,一律使用PyObject *。
Python的类型与C语言类型可以相互转换。Python类型XXX转换为C语言类型YYY要使用PyXXX_AsYYY函数;C类型YYY转换为Python类型XXX要使用PyXXX_FromYYY函数。
也可以创建Python类型的变量,使用PyXXX_New可以创建类型为XXX的变量。
若a是Tuple,则a[i] = b对应于 PyTuple_SetItem(a,i,b),有理由相信还有一个函数PyTuple_GetItem完成取得某一项的值。
不仅Python语言很优雅,Python的库函数API也非常优雅。
现在我们得到了一个C语言的函数了,可以写一个main测试它
#include <Python.h>
int great_function_from_python(int a);
int main(int argc, char *argv[]) {
Py_Initialize();
printf("%d",great_function_from_python(2));
Py_Finalize();
}
编译的方式就用本节开头使用的方法。
在Linux/Mac OSX运行此示例之前,可能先需要设置环境变量:
bash:
export PYTHONPATH=.:$PYTHONPATH
csh:
setenv PYTHONPATH .:$PYTHONPATH
2 Python 调用 C/C++(基础篇)
这种做法称为Python扩展。
比如说,我们有一个功能强大的C函数:
int great_function(int a) {
return a + 1;
}
期望在Python里这样使用:
>>> from great_mole import great_function
>>> great_function(2)
3
考虑最简单的情况。我们把功能强大的函数放入C文件 great_mole.c 中。
#include <Python.h>
int great_function(int a) {
return a + 1;
}
static PyObject * _great_function(PyObject *self, PyObject *args)
{
int _a;
int res;
if (!PyArg_ParseTuple(args, "i", &_a))
return NULL;
res = great_function(_a);
return PyLong_FromLong(res);
}
static PyMethodDef GreateMoleMethods[] = {
{
"great_function",
_great_function,
METH_VARARGS,
""
},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initgreat_mole(void) {
(void) Py_InitMole("great_mole", GreateMoleMethods);
}
除了功能强大的函数great_function外,这个文件中还有以下部分:
包裹函数_great_function。它负责将Python的参数转化为C的参数(PyArg_ParseTuple),调用实际的great_function,并处理great_function的返回值,最终返回给Python环境。
导
出表GreateMoleMethods。它负责告诉Python这个模块里有哪些函数可以被Python调用。导出表的名字可以随便起,每一项有4
个参数:第一个参数是提供给Python环境的函数名称,第二个参数是_great_function,即包裹函数。第三个参数的含义是参数变长,第四个
参数是一个说明性的字符串。导出表总是以{NULL, NULL, 0, NULL}结束。
导出函数initgreat_mole。这个的名字不是任取的,是你的mole名称添加前缀init。导出函数中将模块名称与导出表进行连接。
在Windows下面,在Visual Studio命令提示符下编译这个文件的命令是
cl /LD great_mole.c /o great_mole.pyd -IC:\Python27\include C:\Python27\libs\python27.lib
/LD 即生成动态链接库。编译成功后在当前目录可以得到 great_mole.pyd(实际上是dll)。这个pyd可以在Python环境下直接当作mole使用。
在Linux下面,则用gcc编译:
gcc -fPIC -shared great_mole.c -o great_mole.so -I/usr/include/python2.7/ -lpython2.7
在当前目录下得到great_mole.so,同理可以在Python中直接使用。
本部分参考资料
《Python源码剖析-深度探索动态语言核心技术》是系统介绍CPython实现以及运行原理的优秀教程。
Python 官方文档的这一章详细介绍了C/C++与Python的双向互动Extending and Embedding the Python Interpreter
关于编译环境,本文所述方法仅为出示原理所用。规范的方式如下:3. Building C and C++ Extensions with distutils
作为字典使用的官方参考文档 Python/C API Reference Manual
用以上的方法实现C/C++与Python的混合编程,需要对Python的内部实现有相当的了解。接下来介绍当前较为成熟的技术Cython和SWIG。
3 C/C++ 调用 Python(使用Cython)
在
前面的小节中谈到,Python的数据类型和C的数据类型貌似是有某种“一一对应”的关系的,此外,由于Python(确切的说是CPython)本身是
由C语言实现的,故Python数据类型之间的函数运算也必然与C语言有对应关系。那么,有没有可能“自动”的做替换,把Python代码直接变成C代码
呢?答案是肯定的,这就是Cython主要解决的问题。
安装Cython非常简单。Python 2.7.9以上的版本已经自带easy_install:
easy_install -U cython
在Windows环境下依然需要Visual
Studio,由于安装的过程需要编译Cython的源代码,故上述命令需要在Visual
Studio命令提示符下完成。一会儿使用Cython的时候,也需要在Visual
Studio命令提示符下进行操作,这一点和第一部分的要求是一样的。
继续以例子说明:
#great_mole.pyx
cdef public great_function(a,index):
return a[index]
这其中有非Python关键字cdef和public。这些关键字属于Cython。由于我们需要在C语言中使用
“编译好的Python代码”,所以得让great_function从外面变得可见,方法就是以“public”修饰。而cdef类似于Python的
def,只有使用cdef才可以使用Cython的关键字public。
这个函数中其他的部分与正常的Python代码是一样的。
接下来编译 great_mole.pyx
cython great_mole.pyx
得到great_mole.h和great_mole.c。打开great_mole.h可以找到这样一句声明:
__PYX_EXTERN_C DL_IMPORT(PyObject) *great_function(PyObject *, PyObject *)
写一个main使用great_function。注意great_function并不规定a是何种类型,它的
功能只是提取a的第index的成员而已,故使用great_function的时候,a可以传入Python
String,也可以传入tuple之类的其他可迭代类型。仍然使用之前提到的类型转换函数PyXXX_FromYYY和PyXXX_AsYYY。
//main.c
#include <Python.h>
#include "great_mole.h"
int main(int argc, char *argv[]) {
PyObject *tuple;
Py_Initialize();
initgreat_mole();
printf("%s\n",PyString_AsString(
great_function(
PyString_FromString("hello"),
PyInt_FromLong(1)
)
));
tuple = Py_BuildValue("(iis)", 1, 2, "three");
printf("%d\n",PyInt_AsLong(
great_function(
tuple,
PyInt_FromLong(1)
)
));
printf("%s\n",PyString_AsString(
great_function(
tuple,
PyInt_FromLong(2)
)
));
Py_Finalize();
}
编译命令和第一部分相同:
在Windows下编译命令为
cl main.c great_mole.c -IC:\Python27\include C:\Python27\libs\python27.lib
在Linux下编译命令为
gcc main.c great_mole.c -o main -I/usr/include/python2.7/ -lpython2.7
这个例子中我们使用了Python的动态类型特性。如果你想指定类型,可以利用Cython的静态类型关键字。例子如下:
#great_mole.pyx
cdef public char great_function(const char * a,int index):
return a[index]
cython编译后得到的.h里,great_function的声明是这样的:
__PYX_EXTERN_C DL_IMPORT(char) great_function(char const *, int);
很开心对不对!
这样的话,我们的main函数已经几乎看不到Python的痕迹了:
//main.c
#include <Python.h>
#include "great_mole.h"
int main(int argc, char *argv[]) {
Py_Initialize();
initgreat_mole();
printf("%c",great_function("Hello",2));
Py_Finalize();
}
在这一部分的最后我们给一个看似实用的应用(仅限于Windows):
还是利用刚才的great_mole.pyx,准备一个dllmain.c:
#include <Python.h>
#include <Windows.h>
#include "great_mole.h"
extern __declspec(dllexport) int __stdcall _great_function(const char * a, int b) {
return great_function(a,b);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpReserved) {
switch( fdwReason ) {
case DLL_PROCESS_ATTACH:
Py_Initialize();
initgreat_mole();
break;
case DLL_PROCESS_DETACH:
Py_Finalize();
break;
}
return TRUE;
}
在Visual Studio命令提示符下编译:
cl /LD dllmain.c great_mole.c -IC:\Python27\include C:\Python27\libs\python27.lib
会得到一个dllmain.dll。我们在Excel里面使用它,没错,传说中的Excel与Python混合编程:
参考资料:Cython的官方文档,质量非常高:
Welcome to Cython’s Documentation
❽ 如何实现C与python混合编程
实现C与python混合编程方法
代码如下:
/* tcpportping.c */
#include <Python.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/time.h>
/* count time functions */
static double mytime(void)
{
struct timeval tv;
if (gettimeofday(&tv, NULL) == -1)
return 0.0;
return (double)tv.tv_usec + (double)tv.tv_sec * 1000000;
}
static PyObject * /* returns object */
tcpping(PyObject *self, PyObject *args )
{
struct sockaddr_in addr;
struct hostent *hp;
double time;
char *host = NULL;
int fd;
int port, timeout;
if (!PyArg_ParseTuple(args, "sii", &host, &port, &timeout)) /* convert Python -> C */
return NULL; /* null=raise exception */
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
return Py_BuildValue("d", -1.0); /* convert C -> Python */
}
bzero((char *)&addr, sizeof(addr));
if ((hp = gethostbyname(host)) == NULL) {
return Py_BuildValue("d", -2.0); /* convert C -> Python */
}
b(hp->h_addr, &addr.sin_addr, hp->h_length);
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = timeout * 1000;
double stime = mytime();
if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
return Py_BuildValue("d", -3.0); /* convert C -> Python */
}
fd_set read, write;
FD_ZERO(&read);
FD_ZERO(&write);
FD_SET(fd, &read);
FD_SET(fd, &write);
if (select(fd + 1, &read, &write, NULL, &tv) == 0) {
close(fd);
return Py_BuildValue("d", -4.0); /* convert C -> Python */
}
double etime = mytime();
time = etime - stime;
if (!FD_ISSET(fd, &read) && !FD_ISSET(fd, &write)) {
close(fd);
return Py_BuildValue("d", -4.0); /* convert C -> Python */
}
close(fd);
return Py_BuildValue("d", time/1000); /* convert C -> Python */
}
/* registration table */
static struct PyMethodDef portping_methods[] = {
{"tcpping", tcpping, METH_VARARGS}, /* method name, C func ptr, always-tuple */
{NULL, NULL} /* end of table marker */
};
/* mole initializer */
void inittcpportping( ) /* called on first import */
{ /* name matters if loaded dynamically */
(void) Py_InitMole("tcpportping", portping_methods); /* mod name, table ptr */
}
❾ 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 代码的速度和性能来执行。
❿ 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指定的目录中找。