Step by step to write python extension in C language

高洛峰
Release: 2016-10-18 10:18:05
Original
1271 people have browsed it

This article introduces how to extend python with C language. The example given is to add a function to Python to set a string to the Windows Clipboard. The environment I used when writing the following code is: windows xp, gcc.exe 4.7.2, Python 3.2.3.

The first step is to write a C language DLL

Create a clip.c file with the following content:

// 设置 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);
}
Copy after login

The second step is to write the python setup.py

Create a setup.py file with the following content:

from distutils.core import setup, Extension
  
module1 = Extension(&#39;clip&#39;,
                    sources = [&#39;clip.c&#39;])
  
setup (name = &#39;clip&#39;,
       version = &#39;1.0&#39;,
       description = &#39;This is a clip package&#39;,
       ext_modules = [module1])
Copy after login

Chapter Three steps to compile with python

Run the following command:

python setup.py build --compiler=mingw32 install

In my environment, the following error will be prompted:

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

error: command 'gcc' failed with exit status 1

Open the %PYTHON installation directory%/Lib/distutils/cygwinccompiler.py file, delete -mno-cygwin in it, and then run it again.


After normal operation, a clip.pyd file will be generated and copied to the %PYTHON installation directory%/Lib/site-packages directory


The fourth step is to test the extension

Write A test.py, the content is as follows:

# -*- encoding: gbk -*-
import clip
clip.setclip("Hello python")
Copy after login

Run

python test.py

and then paste it anywhere to verify whether it is correct.


source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template