Heim  >  Artikel  >  Backend-Entwicklung  >  Schritt für Schritt zum Schreiben einer Python-Erweiterung in C-Sprache

Schritt für Schritt zum Schreiben einer Python-Erweiterung in C-Sprache

高洛峰
高洛峰Original
2016-10-18 10:18:051252Durchsuche

In diesem Artikel wird erläutert, wie Sie Python mit der C-Sprache erweitern. Das angegebene Beispiel besteht darin, Python eine Funktion hinzuzufügen, um eine Zeichenfolge in der Windows-Zwischenablage festzulegen. Die Umgebung, die ich beim Schreiben des folgenden Codes verwendet habe, ist: Windows XP, gcc.exe 4.7.2, Python 3.2.3.

Der erste Schritt besteht darin, die C-Sprach-DLL zu schreiben

Erstellen Sie eine Clip.c-Datei mit folgendem Inhalt:

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

Der zweite Schritt besteht darin, die Python zu schreiben setup.py

Erstellen Sie eine setup.py-Datei mit folgendem Inhalt:

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])

Der dritte Schritt besteht darin, mit Python zu kompilieren

Führen Sie den folgenden Befehl aus:

python setup.py build --compiler=mingw32 install

löst in meiner Umgebung den folgenden Fehler aus:

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

Fehler: Befehl 'gcc' fehlgeschlagen mit Exit-Status 1

Öffnen Sie die Datei %PYTHON-Installationsverzeichnis%/Lib/distutils/cygwinccompiler.py, löschen Sie -mno-cygwin darin und dann Führen Sie es erneut aus.


Nach dem normalen Betrieb wird eine Datei „clip.pyd“ generiert und in das Verzeichnis %PYTHON-Installationsverzeichnis%/Lib/site-packages


Der vierte Schritt besteht darin, die Erweiterung zu testen

Schreiben Sie eine test.py mit folgendem Inhalt:

# -*- encoding: gbk -*-
import clip
clip.setclip("Hello python")
Run

Python-Test .py

und fügen Sie es dann an einer beliebigen Stelle ein, um zu überprüfen, ob es korrekt ist.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn