您的位置:首页 > 运维架构 > Linux

Linux使用Python调用C/C++接口

2014-05-09 08:01 931 查看
C++头文件 pyExt.h:

01
#ifndef
 PYEXT_H
02
#define
 PYEXT_H
03
#include
 <Python.h>
04
05
class
pyExt
06
{
07
public
:
08
pyExt()
 {}
09
~pyExt()
 {}
10
11
static
void
Foo();
12
};
13
14
#endif
 // PYEXT_H
main.cpp:

01
#include
 "pyExt.h"
02
#include
 <iostream>
03
using
namespace
std;
04
05
void
pyExt::Foo()
 {
06
printf
(
"printf,
 Python extensions!!\n"
);
07
cout
 <<
"cout,
 Python extensions!!"
<<
 endl;
08
}
09
10
static
PyObject
 *func(
void
)
 {
11
printf
(
"printf,
 Python extensions!!\n"
);
12
cout
 <<
"cout,
 Python extensions!!"
<<
 endl;
13
return
Py_BuildValue(
"s"
,
"Hello,
 Python extensions!!"
);
14
}
15
16
static
PyMethodDef
 My_methods[] = {
17
{
"func"
,
(PyCFunction) func,METH_VARARGS,NULL },
18
{
NULL,NULL,0,NULL }
19
};
20
21
PyMODINIT_FUNC
 initPyExt(
void
)
 {
22
PyObject
 *m=Py_InitModule(
"PyExt"
,
 My_methods);
23
24
if
(m
 == NULL)
25
return
;
26
}
c模块中的函数签名一般有下列三种形式:

PyObject* MyFunction(PyObject* self,PyObject* args);

PyObject* MyFunctionWithKeywords(PyObject* self,PyObject* args,PyObject* kw);

PyObject* MyFunctionWithNoArgs(PyObject* self);

继续上面例子,最方便最快捷扩展接口,首先写一个setup.py脚本:

1
from
distutils.core
import
setup,
 Extension
2
setup(name
=
'PyExt'
,
 version
=
'1.0'
,
\
3
  
ext_modules
=
[Extension(
'PyExt'
,
 sources
=
[
'main.cpp'
])])
然后执行下述命令进行build:

1
python
 .
/
setup.py
 build
这会在当前目录下生成一个build子目录,其中包含了中间生成的PyExt.o以及最后生成出来的PyExt.so.

进行安装命令:

1
python
 .
/
setup.py
 install
或者手动复制到以下目录:

1
sudo
cp
PyExt.so
 到 /usr/
local
/lib/python2.7/dist-packages
可以开始测试模块了:

shell中命令运行python,import模块名,dir查看被导出函数名:

>>import PyExt

>>dir(PyExt)

>>['__doc__','__file__','__name__','__package__','func']

得知调用函数为func(),测试函数:

view
source

print?

1
import
PyExt
2
3
def
main():
4
print
PyExt.func()
5
6
if
__name__
=
=
'__main__'
:
7
main()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: