VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 一步步来用C语言来写python扩展

本文介绍如何用 C 语言来扩展 python。所举的例子是,为 python 添加一个设置字符串到 windows 的剪切板(Clipboard)的功能。我在写以下代码的时候用到的环境是:windows xp, gcc.exe 4.7.2, Python 3.2.3。

第一步 撰写C语言的DLL

创建一个 clip.c 文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// 设置 UNICODE 库,这样的话才可以正确复制宽字符集
#define UNICODE
 
#include <windows.h>
#include <python.h>
 
// 设置文本到剪切板(Clipboard)
static PyObject *setclip(PyObject *self, PyObject *args)
{
  LPTSTR  lptstrCopy;
  HGLOBAL hglbCopy;
  Py_UNICODE *content;
  int len = 0;
 
  // 将 python 的 UNICODE 字符串及长度传入
  if (!PyArg_ParseTuple(args,"u#", &content, &len))
    return NULL;
 
  Py_INCREF(Py_None);
 
  if (!OpenClipboard(NULL))
    return Py_None;
 
  EmptyClipboard();
 
  hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (len+1) *sizeof(Py_UNICODE));
  if (hglbCopy == NULL) {
    CloseClipboard();
    return Py_None;
  }
 
  lptstrCopy = GlobalLock(hglbCopy);
  memcpy(lptstrCopy, content, len *sizeof(Py_UNICODE));
  lptstrCopy[len] = (Py_UNICODE) 0;
 
  GlobalUnlock(hglbCopy);
 
  SetClipboardData(CF_UNICODETEXT, hglbCopy);
 
  CloseClipboard();
 
  return Py_None;
}
 
// 定义导出给 python 的方法
static PyMethodDef ClipMethods[] = {
  {"setclip", setclip, METH_VARARGS,
   "Set string to clip."},
  {NULL, NULL, 0, NULL}
};
 
// 定义 python 的 model
static struct PyModuleDef clipmodule = {
  PyModuleDef_HEAD_INIT,
  "clip",
  NULL,
  -1,
  ClipMethods
};
 
// 初始化 python model
PyMODINIT_FUNC PyInit_clip(void)
{
  return PyModule_Create(&clipmodule);
}

相关教程