ubuntu下python導入.so庫
文章目錄
- ubuntu下python導入.so庫
- 1. 什么是`.so`文件?
- 2. 使用python腳本編譯`.so`庫文件
- Reference
最近遇到了python導入c++編譯的
.so
庫的問題,發覺挺有意思,于是寫下這篇blog以作記錄。
1. 什么是.so
文件?
.so
文件全稱是Shared Object,是一種共享文件格式,主要是在Unix和類Unix操作系統(如Linux和BSD)上進行使用,這些文件可以包含多個程序同時加載和使用的代碼和數據。為什么會有這種.so
庫文件,共享庫(.so
文件)通過促進代碼重用、節省資源、簡化更新和維護、增強靈活性和動態性、提高開發效率以及集中管理安全性和穩定性,極大地提升了軟件開發和部署的效率和質量。這些優勢使得共享庫成為現代軟件開發中不可或缺的一部分。更重要的是,這樣可以保護廠商的技術源碼,使得這部分對于用戶來說是黑箱,只將接口部分暴露給用戶。
2. 使用python腳本編譯.so
庫文件
這里舉個簡單的例子,使用python腳本來編譯.so
庫文件,在編譯之前,我們需要安裝gcc
、g++
和cython
sudo apt install gcc
sudo apt install g++
sudo apt install cython
如果使用了conda
或者miniconda
這類的虛擬環境管理,還要激活虛擬環境,然后
pip install cython
這樣我們的準備工作就做好了,然后可以開始編寫python腳本了
一、編寫python腳本文件:
mymodule.py
# mymodule.py
class MyClass:def hello(self):print("Hello from MyClass")
二、編寫cython腳本文件:
mymodule.pyx
# mymodule.pyx
cdef class MyClass:def hello(self):print("Hello from MyClass")
三、編寫setup.py
用于配置:
setup.py
from setuptools import setup
from setuptools.extension import Extension
from Cython.Build import cythonizeextensions = [Extension("mymodule", ["mymodule.pyx"]),
]setup(ext_modules=cythonize(extensions),
)
然后激活你包含python的虛擬環境
python setup.py build_ext --inplace
這樣就會生成一個.so
庫文件,這個文件名類似于mylib.cpython-<version>-<platform>.so
,例如,mymodule.cpython-312-x86_64-linux-gnu.so
,為了方便可以將這個文件重命名為mymodule.so
,然后我們就可以在代碼中使用它了
四、在python使用.so
庫:
test.py
from mymodule import MyClassobj = MyClass()
obj.hello()
運行效果如下:

Reference
[1]python調用c++模塊.so庫, 互相回傳數據(ctypes、pybind11)