python代码如何转换成C语言代码?代码如下:

Python013

python代码如何转换成C语言代码?代码如下:,第1张

转换c语言后的代码

void tset(int s[],int n){

for(int i=0i<ni++)

s[i]=s[i]+1

}

int s[]={1, 2, 3, 4, 5, 5, 6, 1, 4, 5, 5, 7, 1, 5, 3, 8, 3, 5, 9, 1}

int i

while( i <=30)

tset(s)

i+=1

if i>1:

printf("%s",s)

i+=1

在哪里写都可以啊,重要的是编译过程。给你介绍下编译过程吧。

在windows和linux下面,对C扩展的编译方法是不一样的,我们先来看windows版的。

我们用C实现一个简单的加法。

首先新建一个文件add.c,代码如下:

#include <Python.h>

static PyObject* add(PyObject *self, PyObject *args) 

//一定声明为static,把他们限制在这个文件范围里。 几乎所有的参数都是PyObject类型,在python,每个东西都是object。 

static PyObject* add(PyObject* self, PyObject* args) 

    int x=0  

    int y=0

    int z=0

    if (! PyArg_ParseTuple(args, "i|i", &x, &y))

        return NULL

    /*第一个参数是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

    return Py_BuildValue("i", z)

    /*调用完之后我们需要返回结果。这个结果是c的type或者是我们自己定义的类型。必须把他转换成PyObject, 让python认识。这个用Py_BuildValue 

      来完成。他是PyArg_ParseTuple的逆过程。他的第一个参数和PyArg_ParseTuple的第二个参数一样, 是个格式化符号。第三个参数 

      是我们需要转换的参数。Py_BuildValue会把所有的返回只组装成一个tutple给python。*/

static PyMethodDef addMethods[] =

    {"add",  add, METH_VARARGS, "Execute a shell command."}, 

    {NULL, NULL, 0, NULL}

/*这个是一个c的结构。他来完成一个映射。 我们需要把我们扩展的函数都映射到这个表里。表的第一个字段是python真正认识的。是python  里的方法名字。 第二个字段是python里的这个方法名字的具体实现的函数名。 在python里调用add, 真正执行的是用c写的add函数。第三个字段是METH_VARARGS, 他告诉python,add是调用c函数来实现的。第四个字段是这个函数的说明。如果你在python里来help这个函数,将显示这个说明。相当于在python里的函数的文档说明。*/

PyMODINIT_FUNC initadd() 

    Py_InitModule("add", addMethods) 

/*注意,这个函数的名字不能改动。 必须是init+模块名字。 我们的模块名字是add。所以这个函数是initadd()。

  这样python在导入add 的模块时候,才会找到这个函数,并调用。这个函数调用Py_InitModule来将模块名字和映射表结合在一起。 他表示,add这个模块使用addMethods这个映射表。python应该这样导入我们的module的.*/

新建一个setup.py,内容如下:

from distutils.core import setup, Extension 

module1 = Extension('add', sources = ['add.c']) 

setup (name = 'PackageName', version = '1.0', description = 'This is a demo package', ext_modules= [module1])

组建:(由于我的机器上装了mingw,所以指定了mingw32。默认的编译器是vs2008。参考:

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,基本上就是如此了。

在linux下的话,会有少许不同.

即直接用makefile将add.c编译成.so,python可以直接import,makefile代码如下:

PYLIB = /usr/bin

PYINC = /usr/include/python2.6

all: add.c

        gcc add.c -g -I$(PYINC) -shared -L$(PYLIB) -lpython2.6 -o add.so

clean:

        rm -f add.so

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

1、CPython

是Python语言规范的参考实现,能够优先获得Python语言的最新、最强的功能,CPython是由C语言编写而成,不但可以从Python代码中调用C代码的函数,还可以直接在Python中使用大量现有的C代码库。

2、Brython

Brython可用于在浏览器中运行包含了Python 3脚本的Web应用。

3、PyPy Python

虽然第一个推荐的是在Python中使用最广泛的编译器,但却不是最快的,PyPy采用的是即时的编译概念,在代码执行前,就直接编译为机器代码,因此其执行速度提高了近4倍。

4、Jython或JPython

使用率第二高,Jython最初被称为JPython,是通过Python语言来实现Java虚拟机的,开发者既可以将现有的Java包和代码库,导入自己的Python程序中,还可以在Java程序中嵌入Python脚本。

5、Cython

Cython与CPython不同,更像是一个超集,允许开发者在代码中结合C和Python,从而生成C语言代码类型的输出,以供任何一种C/C++编译器进行后续编译。

6、Skulpt

流行的速度非常快,主要目的是提供一种良好的在线式Python编译器,也可以通过让Web应用引擎包含Skulpt,以方便开发者编写出被用于前端的Python脚本。

7、PyJS

是另一款完全用Python去开发Web应用的编译工具,在后台,PyJS会在使用内置的Ajax框架之前,将Python代码编译为JavaScript。

8、WinPython

是Python的"即用型"发行版,也就意味着用户无需安装,即可在Windows PC上运行,作为另一种Python的实现,WinPython编译器不仅带来了Python执行环境,而且还包含了诸如:Scipy、Numpy、以及Pandas等各种Python库。