一步步来用C语言来写python扩展

本文介绍如何用 C 语言来扩展 python。所举的例子是,为 python 添加一个设置字符串到 windows 的剪切板(Clipboard)的功能。我在写...

本文介绍如何用 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);

}

第二步 写 python 的 setup.py

创建一个 setup.py 文件,内容如下:


1

2

3

4

5

6

7

8

9

from distutils.core import setup, Extension

 

module1 = Extension(‘clip‘,

                    sources = [‘clip.c‘])

 

setup (name = ‘clip‘,

       version = ‘1.0‘,

       description = ‘This is a clip package‘,

       ext_modules = [module1])

第三步 用 python 编译

运行以下命令:

python setup.py build --compiler=mingw32 install

在我的环境中会提示以下错误:

gcc: error: unrecognized command line option ‘-mno-cygwin‘

error: command ‘gcc‘ failed with exit status 1

打开 %PYTHON安装目录%/Lib/distutils/cygwinccompiler.py 文件,将里面的 -mno-cygwin 删除掉,然后再运行即可。

正常运行后,会生成一个 clip.pyd 文件,并将该文件复制到 %PYTHON安装目录%/Lib/site-packages 目录中

第四步 测试该扩展

写一个 test.py, 内容如下:


1

2

3

# -*- encoding: gbk -*-

import clip

clip.setclip("Hello python")

运行

python test.py

再到任何一个地方粘贴,即可验证是否正确。

时间: 2024-10-10 15:27:19

一步步来用C语言来写python扩展的相关文章

C语言代写,C语言作业代写,代写C语言,C语言编程代写

C语言代写,C语言作业代写,代写C语言,C语言编程代写 我是一线IT企业程序员,目前接各种代码代写业务: 代写C语言.代做C语言.C语言作业代写.C语言代写 代写C++.代做C++.C++作业代写.C++作业代写 代写Python.代做Python.Python作业代写.Python作业代做 代写Java.代做Java.Java作业代写.Java作业代做 代写编程作业.代做编程.编程代写.编程代做 先写代码再给钱,不要任何定金!价钱公道,具体见图,诚信第一!(涉及图形化界面.或领域类知识如金融数

代写C语言,C语言代写,C语言作业代写,C语言编程代写

代写C语言,C语言代写,C语言作业代写,C语言编程代写 我是一线IT企业程序员,目前接各种代码代写业务: 代写C语言.代做C语言.C语言作业代写.C语言代写 代写C++.代做C++.C++作业代写.C++作业代写 代写Python.代做Python.Python作业代写.Python作业代做 代写Java.代做Java.Java作业代写.Java作业代做 代写编程作业.代做编程.编程代写.编程代做 先写代码再给钱,不要任何定金!价钱公道,具体见图,诚信第一!(涉及图形化界面.或领域类知识如金融数

易语言怎样写双线程?一个线程循环找图。一个线程循环按键F2。

易语言怎样写双线程? 一个线程循环找图.一个线程循环按键F2. // .程序集变量 参数, 整数型 .程序集变量 线程句柄1, 整数型 .程序集变量 线程句柄2, 整数型 启动线程 (&子程序1, 参数,线程句柄1) 启动线程 (&子程序2, ,线程句柄2) // .子程序 子程序1 .参数 参数1, 整数型 信息框 (参数1, 0, ) 信息框 (“这是线程1的例子”, 0, ) // .子程序 子程序2 信息框 (“这是线程2的例子”, 0, ) // // 注意: 凡调用到COM接口

C语言怎么写头文件?

C语言中.h和.c文件解析(很精彩)   简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件) 4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息.(生成.exe文件)

JavaScript 代写、代写JavaScript 编程作业、用JavaScript 做maze、JavaScript语言代写

1 InstructionsIn this assignment, you will be required to write JavaScript functions that simplify navigating anelaborate maze.1.1 Data File SpecificationAn example of properly formatted file is shown in Figure 1. The first file encodes a maze, these

用Notepad++写python的小配置

在上一家公司的时候,写python,用的emeditor,由于是公司的电脑,都是配置好的,写python还是比较顺手,现在离开后,一直用notepad++,想转到notepad++来写python的代码,遂研究了下,配置了自己的Notepad++的python环境. 首先你要安装python.notepad++,这个去官网下载安装就行,不多赘言. 安装完基本工具后,开始配置Notepad++了. 1.点击“运行”-“运行”,弹出一个对话框,输入命令 cmd /k C:\Python27\pyth

嵌入式linux C++语言(二)——C++对C语言基础语法的扩展

嵌入式linux C++语言(二)--C++对C语言基础语法的扩展 C++是基于C语言扩展发展而来的面向对象的程序设计语言,本文将主要讨论C++语言基于C语言扩展的方面. 一.类型增强 1.类型检查更严格 在C语言中: const int a = 100; int *p = &a; 在C++语言中: const int a = 100;//必须在定义的时候初始化 const int *p = &a; 在C++语言中不能隐式转换数据类型. error: invalid conversion

Python代写,Python作业代写,代写Python,代做Python

Python代写,Python作业代写,代写Python,代做Python 我是一线IT企业程序员,目前接各种代码代写业务: 代写C语言.代做C语言.C语言作业代写.C语言代写 代写C++.代做C++.C++作业代写.C++作业代写 代写Python.代做Python.Python作业代写.Python作业代做 代写Java.代做Java.Java作业代写.Java作业代做 代写编程作业.代做编程.编程代写.编程代做 先写代码再给钱,不要任何定金!价钱公道,具体见图,诚信第一!(涉及图形化界面.

IOS开发语言Swift入门连载---扩展

IOS开发语言Swift入门连载-扩展 扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality).这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模).扩展和 Objective-C 中的分类(categories)类似.(不过与Objective-C不同的是,Swift 的扩展没有名字.) Swift中的扩展可以: 添加计算型属性和计算静态属性 定义实例方法和类型方法 提供新的构造器 定义下标 定义和使用新的嵌套类型 使一个已有类型符合某个协议 注意: 如