(转)使用C/C++扩展Python
使用C/C++扩展Python
翻译:
gashero
如果你会用C,实现Python嵌入模块很简单。利用扩展模块可做很多Python不方便做的事情,他们可以直接调用C库和系统调用。
为了支持扩展,Python API定义了一系列函数、宏和变量,提供了对Python运行时系统的访问支持。Python的C API由C源码组成,并包含 “Python.h” 头文件。
编写扩展模块与你的系统相关,下面会详解。
目录
1 一个简单的例子
2 关于错误和异常
3 回到例子
4 模块方法表和初始化函数
5 编译和连接
6 在C中调用Python函数
7 解析传给扩展模块函数的参数
8 解析传给扩展模块函数的关键字参数
9 构造任意值
10 引用计数
10.1 Python中的引用计数
10.2 拥有规则
10.3 危险的薄冰
10.4 NULL指针
11 使用C++编写扩展
12 提供给其他模块以C API
1 一个简单的例子
下面的例子创建一个叫做 “spam” 的扩展模块,调用C库函数 system() 。这个函数输入一个NULL结尾的字符串并返回整数,可供Python调用方式如下:
>>> import spam
>>> status=spam.system("ls -l")
一个C扩展模块的文件名可以直接是 模块名.c 或者是 模块名module.c 。第一行应该导入头文件:
#include <Python.h>
这会导入Python API。
Warning
因为Python含有一些预处理定义,所以你必须在所有非标准头文件导入之前导入Python.h 。
Python.h中所有用户可见的符号都有 Py 或 PY 的前缀,除非定义在标准头文件中。为了方便 “Python.h” 也包含了一些常用的标准头文件,包括<stdio.h>,<string.h>,<errno.h>,<stdlib.h>。如果你的系统没有后面的头文件,则会直接定义函数 malloc() 、 free() 和 realloc() 。
下面添加C代码到扩展模块,当调用 “spam.system(string)” 时会做出响应:
static PyObject*
spam_system(PyObject* self, PyObject* args) {
const char* command;
int sts;
if (!PyArg_ParseTuple(args,"s",&command))
return NULL;
sts=system(command
相关文档:
系统环境:Windows 7
软件环境:Visual C++ 2008 SP1 +SQL Server 2005
本次目的:编写一个航空管理系统
这是数据库课程设计的成果,虽然成绩不佳,但是作为我用VC++ 以来编写的最大程序还是传到网上,以供参考。用VC++ 做数据库设计并不容易,但也不是不可能。以下是我的程序界面,后面 ......
//输入一个数组,再修改这个数组所有元素,如何实现?
int main()
{
vector<int> a;
int i(0);
while(cin>>i)
a.push_back(i);
//////////////////////////////////////////////////////输出建立的数组:
cout << "得到的数组为:" << ......
二分查找的代码.
int bfind(int* a,int len,int val)
{
int m = len/2;
int l = 0;
int r = len;
while(l!=m && r!= m)
{
if(a[m] > val)
& ......
操作系统的一个经典问题是"生产者-消费者"问题, 这涉及同步信号量和互斥信号量的应用, 在这里,我用线程的同步和互斥来实现.
/*
* author 张文
* 2008/06/20
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h> ......