在Python中,我們可以把代碼編譯為動(dòng)態(tài)鏈接庫(kù)(.so文件),這樣可以使代碼在運(yùn)行時(shí)更加高效。下面介紹如何將Python代碼編譯為.so文件。
首先,需要安裝cffi模塊。可以使用pip命令進(jìn)行安裝:
pip install cffi
編寫Python代碼,將其保存為example.py:
def add(a, b): return a + b
然后,我們需要編寫一個(gè)C代碼,實(shí)現(xiàn)Python代碼中的函數(shù)。將C代碼保存為example.c:
#include <Python.h> static PyObject* add(PyObject* self, PyObject* args) { int a, b; if (!PyArg_ParseTuple(args, "ii", &a, &b)) return NULL; return Py_BuildValue("i", a + b); } static PyMethodDef ExampleMethods[] = { {"add", add, METH_VARARGS, "Add two integer numbers"}, {NULL, NULL, 0, NULL} }; static struct PyModuleDef examplemodule = { PyModuleDef_HEAD_INIT, "example", NULL, -1, ExampleMethods }; PyMODINIT_FUNC PyInit_example(void) { return PyModule_Create(&examplemodule); }
注意,add函數(shù)的輸入?yún)?shù)是一個(gè)PyObject類型的args,需要使用PyArg_ParseTuple函數(shù)對(duì)其進(jìn)行解析。
然后,我們需要將C代碼編譯為.so文件。可以使用以下命令進(jìn)行編譯:
gcc -o example.so -shared -fPIC example.c -I/usr/include/python3.5m -lpython3.5m
注意,編譯時(shí)需要指定Python的頭文件和庫(kù)文件。
最后,我們可以在Python中使用編譯好的.so文件,例如:
import example print(example.add(1, 2))
輸出結(jié)果為:3