如何將 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 的目錄,並在該目錄中建立一個副檔名為 .c 的檔案。假設檔名為 greet.c,現在在這個檔案中包含以下描述的標頭檔案。

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

CPython 庫將提供 python.h 標頭檔案,並提供 many.py 擴充套件函式和型別。此庫幫助我們將 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_buildvaluePyArg_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.