关键词不能为空

当前您在: 主页 > 英语 >

goatc语言编写python模块

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-01-28 22:07
tags:

goat-发令枪

2021年1月28日发(作者:解析度)


本文档主要介绍如何使用


VS2010


来把


c


语言编写好的函数编译成


python< /p>


模块



1.


准备



1.1


主要工具



笔者的主要工具有


:



64


,即


64


位的


python


,当然,


32

位的也可以,可到



/downloads/window s/


下载,



本人用的是


python2.7


,用


python3.x


估计也没有问题,我未用过


.


< p>
VS2010



这个不用解释了吧。


c


语言的编译器必须要有的,


VS

< br>的版本可以随意选择,


不过貌



python



VS2010


不是特别 的支持,支持得比较好的是


VS2008


。后面会介绍使用


VS2010


遇到的问题,当然最后得到了解决。说实话,


VS2010


也不算新的了,


python



2.7


了还不


支 持,真坑爹。




swigwin-3 .0.0


,这是个好用的小工具,可以非常方便地把我们非常自然的

c


语言编写的函数


进行转换,转换成可以编译成

< p>
python


模块的包装代码,可以说是中间工具了。


可到


/



Windows


用户应该下载


swigwin-3.0.0< /p>




1.2


设置环境变量



必须设置


python



sw ig


的环境变量,本人


python


的 安装目录为


D:pythonPython27



swig


的解压目录为


D:swigwin-3.0 .0


,将其添加到


path


环境变量即 可。




注意:安装目录必须要按照自 己的安装目录进行设置,后面的命令也要用到安装目录,


因此这里提醒一下。

< p>


2.


编写


c

< p>
语言代码并生成


Python


模块



2.1


使用


swig


生成包装代码并编译



编写

< br>c


语言函数




这里笔者使用《


Python


基础教程(第二版)


》中的回文函数例子。




先编写好两个文件


:palindrome.c



palindrome.i



程序(这是 自己编写的


c


语言函数)


< p>


#include



intis_palindrome(char *text) {


inti, n=strlen(text);


for (i=0; i<=n/2; ++i) {


if (text[i] != text[n-i-1]) return 0;




}


return 1;


}




代码:



%module palindrome



%{


#include


%}



externintis_palindrome(char *text);



两个文件如图所示,本人把两个文件放在了

< br>D:pythonceshi







pal indrome2.c


暂时先不用管它,等下会知道的。




打开


Visual Studio x64 Win64


命令提示


(2010)

< br>,


32


位的用


Visual Studio


命令提示


(2010)



进入


palindrome.c



palindrome.i


所在的文件夹 (笔者的是


D:pythonceshi




输入以下命令




swig -python palindrome.i


cl /c palindrome.c


cl /I D:pythonPython27include /c palindrome_wrap.c


cl


/LD



palindrome_


/I


D:pythonPython27include


D: /o _



第一条命令


swig -python palindrome.i


使用


palin drome.i



palindrome.c

< br>进行转换



会生成


palind rome_wrap.c




两个文件, 如图所示





其中


palindrome_wrap.c


是重要的,这叫包 装代码,其实假如自己直接写包装代码的话,那


么前面就不用写


palindrome.c


,后面会介绍自己写包装代码而不靠


swig





第二第三条命令



cl /c palindrome.c


cl /I D:pythonPython27include /c palindrome_wrap.c



其中


/c


是 指编译但不链接,即只生成


.obj


文件


,/I


是指附加包含文件,注意严格区分大小写



之后陆续生成两个文件,如图所示






最后一条命令



cl


/LD



palindrome_


/I


D:pythonPython27include


D: /o _



/LD

< p>
是指创建动态链接库,而


/o


则表示指定输出的文 件名,注意,


/o


并不是标准的选项,可


查阅


/zh-cn/library/y0zzbyt4(v=vs.100).as px


,因此执行后会出现警





cl:


命令行



warning


D9035


:



o


”选项已否决,并将在将来的版本中移 除



,但是实际上


也是会生成


_


的,因此


/o


选项还 是可用的。




实际上,


/o


非常有用,


如果不用它的话,

< br>那么就只能调用链接器命令


link


< br>这就比较麻烦了,


因此即使此选项已被否决,但能用的话还得用。




最后生成


_


,如图所示




实际上,如果没有


/o _


这一项,则 会生成



,只是这里改了后缀


名为


.pyd


,如果后缀是


.dll


的话,那么


python


将不能识别,


.pyd



python



Windows


中能


识别的模块后缀, 而在


Linux


中则是


.so





注意,


_palindrome


前面的下划线


_


是非常有讲究的,它配合


swig


的生成规则 ,假如取其它


名字的话,则模块不能导入成功。因此,假如不用


/o


_


这一项的话,则必须


手动把< /p>



改为


_






_

< p>
文件复制到


D:pythonPython27Libsite-pack ages


中,


这样的话


python< /p>



可以调用该模块了






注:写 这一部分其实是有目的的,这是因为《


Python


基础教程》 只给出了


gcc


的编译方法,


而没有给 出


VS


的编译方法,幸好网上查找到了



/dbzhang800/item/c157bed38eaec4e6b2f777 42



于是再自己稍加摸索,找出了


V S


对应的步骤。



< br>《


Python


基础教程(第二版)


P298


给出的


gcc


的命令是这样的




gcc



c palindrome.c


gcc



I $$PYTHON_HOME



I$$PYTHON_HOME/Include



c palindrome_wrap.c


gcc



shared drome_wrap.o



o _



gcc



-c


对应


cl



/c


,都是编译但不链接的意思,



I


对 应


/I


,都是附加包含文件的意思,而


-shared


对应


/LD



都是创建动态链接库的意思。


而这里


.o


对应


.obj



.s o


对应


.pyd


都差不多,


甚至选项的符号


-


在< /p>


cl


命令中也可以用,例如


-c


选项在


cl


命令中也是可以使用的。

< p>



2.2


自己编写包装代码


< p>
这个笔者只是简短介绍,具体请查阅《


Python


基础教程(第二版)





编写


palindrome2.c


(这个前面提 到过)


goat-发令枪


goat-发令枪


goat-发令枪


goat-发令枪


goat-发令枪


goat-发令枪


goat-发令枪


goat-发令枪



本文更新与2021-01-28 22:07,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/582238.html

c语言编写python模块的相关文章