如何將C方法附加到現有的Python類?


我們目前正在編寫Python程式碼,其中使用了C方法。所有庫(例如NumPy、OpenCV、PyTorch等)的基礎都是用C和C++構建的,即這些庫內部呼叫編譯後的C程式碼,程式碼將在機器上執行,結果將返回到Python包裝器中。

為什麼我們在Python中使用C方法?

我們在Python中使用C方法的原因是效能。由於動態型別,Python的效能會下降。

  • 在直譯器執行操作之前,它必須減少要傳遞的運算元的型別。這些型別的操作會影響程式的執行時間。

  • C模組允許我們檢查這些運算元並直接透過Python執行機器程式碼。

  • 要使用C模組,我們必須將其與Python連結。將C模組與Python連結有多種方法。

  • 一種方法是使用CPython API。要了解CPython API的工作原理和用法,使用此API的過程如下。

在Python中使用C API的過程

以下是使用Python中C API的步驟:

首先,我們必須安裝python3-dev包才能在Python中使用C方法。可以使用以下程式碼安裝該包。

pip install cpython

使用該程式碼後,我們必須建立一個名為extension的目錄,並在該目錄中建立一個副檔名為**extension.c**的檔案。假設該檔名為**greet.c**,現在在這個檔案中包含以下描述的標頭檔案。

#include <python.h>
#include <string.h>

CPython庫將提供**python.h**標頭檔案,還提供許多擴充套件函式和型別。這個庫幫助我們整合Python和C。

示例

現在,讓我們建立一個程式來使用CPython庫。以下是可以用來使用CPython庫的程式碼。

static PyObject* name(PyObject *self, PyObject* args){
   char *name;
   char greeting[255] = "Hello ";
   if (!PyArg_ParseTuple(args, "s", &name)){
      return NULL;
   }
   strcat(greeting, name);
   return Py_BuildValue("s", greeting);
}

在上面的程式碼中,我們使用了PyObject。PyObject是在C中表示的Python例項。此PyObject函式有兩個引數self和args。

  • self指示當前物件/模組

  • args用於指示Python引數。

定義我們的C方法

**PyArg_ParseTuple**傳遞到Python中,用於解釋C值。第二個引數中的s是一個字串值。如果是任何其他型別,它將在Python中丟擲型別錯誤。**Py_BuildValue**與**PyArg_ParseTuple**相反。這意味著它從C解釋Python中的值。

定義我們的C方法後,我們必須將其與Python介面。以下程式碼用於與Python進行解釋。

static PyMethodDef moduleMethods[] = {
   {"name", name, METH_VARARGS, "Greets with your name"}
};

現在,在將我們的C方法與Python介面之後,我們必須定義模組型別。以下程式碼可用於定義模組型別。

static struct PyModuleDef greetModule = {
   PyModuleDef_HEAD_INIT,
   "greet",
   "Greetings Module",
   -1,
   moduleMethods
};
PyMODINIT_FUNC PyInit_greet(void){
   return PyModule_Create(&greetModule);
};

在當前程式中匯入方法

現在,在定義方法型別並建立方法後,我們必須將其匯入到我們的Python環境中。

import greet
print("Name: ", greet.__name__)
print("Docstring: ", greet.__doc__)
print("Greeting: ", greet.name("Lezwon"))

如果我們執行上述程式碼,將會收到nomodulefound錯誤。這是因為該模組尚未與Python連結。因此,必須完成以下設定才能在Python中使用用C語言建立的模組。

setuptools

首先,我們必須在Python環境中安裝setuptools。必須使用以下程式碼。

pip install setuptools

現在,我們必須使用Python擴充套件建立setup檔案。以下程式碼將用於該Python檔案中。

from setuptools import setup, Extension
ext_modules = [
   Extension('greet', sources = ['greetmodule.c']),
]
setup(
   name = 'Greeting Project',
   ext_modules = ext_modules
)

在上面的程式碼中,我們使用了greet。這表示我們在C中建立的模組。要編譯我們的程式碼,我們必須使用以下命令。

python setup.py build_ext --inplace

現在我們可以執行以下程式碼。

import greet
print("Name: ", greet.__name__)
print("Docstring: ", greet.__doc__)
print("Greeting: ", greet.name("Lezwon"))

更新於:2023年5月15日

瀏覽量:175

啟動您的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.