首頁  >  文章  >  後端開發  >  一步步來用C語言來寫python擴展

一步步來用C語言來寫python擴展

高洛峰
高洛峰原創
2016-10-18 10:18:051256瀏覽

本文介紹如何用 C 語言來擴充 python。所舉的例子是,為 python 增加一個設定字串到 windows 的剪切板(Clipboard)的功能。我在寫以下程式碼的時候用到的環境是:windows xp, gcc.exe 4.7.2, Python 3.2.3。

第一步撰寫C語言的DLL

創建一個clip.c 文件,內容如下:

// 设置 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 文件,內容如下:

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

第reee三步驟用python 編譯

執行以下指令:

python setup.py build --compiler=mingw32 install

在我的環境中會提示以下錯誤:

gcc:

在我的環境中會提示以下錯誤:

gcc:

在我的環境中會提示以下錯誤:

gcc:
cygwin'

error: command 'gcc' failed with exit status 1

開啟%PYTHON安裝目錄%/Lib/distutils/cygwinccompiler.py 檔案,將裡面的-mno-cygwin 刪除掉,然後再執行即可。

正常運作後,會產生一個clip.pyd 文件,並將該檔案複製到%PYTHON安裝目錄%/Lib/site-packages 目錄中

第四步測試該擴充寫第四步測試該擴充寫一個test.py, 內容如下:

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

運行


python test.py

🎜再到任何一個地方粘貼,即可驗證是否正確。 🎜🎜🎜🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn