goat-发令枪
本文档主要介绍如何使用
VS2010
来把
p>
c
语言编写好的函数编译成
python<
/p>
模块
1.
准备
1.1
主要工具
笔者的主要工具有
:
64
,即
64
位的
python
,当然,
32
位的也可以,可到
/downloads/window
s/
下载,
本人用的是
python2.7
,用
python3.x
估计也没有问题,我未用过
.
VS2010
,
这个不用解释了吧。
c
语言的编译器必须要有的,
VS
< br>的版本可以随意选择,
不过貌
似
python
对
VS2010
不是特别
的支持,支持得比较好的是
VS2008
。后面会介绍使用
p>
VS2010
遇到的问题,当然最后得到了解决。说实话,
VS2010
也不算新的了,
python
p>
都
2.7
了还不
支
持,真坑爹。
swigwin-3
.0.0
,这是个好用的小工具,可以非常方便地把我们非常自然的
c
语言编写的函数
进行转换,转换成可以编译成
python
模块的包装代码,可以说是中间工具了。
可到
/
,
Windows
用户应该下载
swigwin-3.0.0<
/p>
。
1.2
设置环境变量
必须设置
python
和
sw
ig
的环境变量,本人
python
的
安装目录为
D:pythonPython27
,
swig
的解压目录为
D:swigwin-3.0
.0
,将其添加到
path
环境变量即
可。
注意:安装目录必须要按照自
己的安装目录进行设置,后面的命令也要用到安装目录,
因此这里提醒一下。
2.
编写
c
语言代码并生成
Python
模块
2.1
使用
swig
生成包装代码并编译
编写
< br>c
语言函数
这里笔者使用《
Python
基础教程(第二版)
p>
》中的回文函数例子。
先编写好两个文件
:palindrome.c
与
p>
palindrome.i
程序(这是
自己编写的
c
语言函数)
:
#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
p>
与
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
是指创建动态链接库,而
/o
则表示指定输出的文
件名,注意,
/o
并不是标准的选项,可
查阅
/zh-cn/library/y0zzbyt4(v=vs.100).as
px
,因此执行后会出现警
告
”
cl:
命令行
warning
D9035
:
p>
“
o
”选项已否决,并将在将来的版本中移
除
”
,但是实际上
也是会生成
_
的,因此
/o
选项还
是可用的。
实际上,
/o
非常有用,
如果不用它的话,
< br>那么就只能调用链接器命令
link
,
< br>这就比较麻烦了,
因此即使此选项已被否决,但能用的话还得用。
最后生成
_
,如图所示
实际上,如果没有
/o _
这一项,则
会生成
,只是这里改了后缀
名为
.pyd
,如果后缀是
.dll
的话,那么
python
将不能识别,
.pyd
是
python
在
Windows
中能
识别的模块后缀,
而在
Linux
中则是
.so
。
注意,
_palindrome
前面的下划线
_
是非常有讲究的,它配合
swig
的生成规则
,假如取其它
名字的话,则模块不能导入成功。因此,假如不用
/o
_
这一项的话,则必须
手动把<
/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
命令中也是可以使用的。
2.2
自己编写包装代码
这个笔者只是简短介绍,具体请查阅《
Python
基础教程(第二版)
》
,
编写
palindrome2.c
(这个前面提
到过)
goat-发令枪
goat-发令枪
goat-发令枪
goat-发令枪
goat-发令枪
goat-发令枪
goat-发令枪
goat-发令枪
-
上一篇:戴炜栋语言学复习资料word版
下一篇:(参考)三段保护动作值的整定计算