將python 文件編譯成so系統文件,直接調用so系統文件,做事就是應該做到最高級


主題:python 源碼編譯

我們通常編寫了python 腳本,但是這些python 屬於接釋性執行的源碼並不利於系統快速的執行,所以我們需要將python 源碼編譯成系統文件。
下面我們就展開研究,實現源碼編譯過程,完成編譯任務。

准備工作:

1、linux python 環境 、centos7.6,

首先需要安裝如下相關包
python 安裝:cython

pip install cython
linux 安裝:python-devel,gcc

如果是centos版linux執行:

yum install python-devel
yum install gcc
如果是ubuntu版linux:

apt-get install python-devel
apt-get install gcc

根據不同版本安裝好python,和依賴的編譯工具

2、新建一個待編譯文件hello.py以及setup.py,

hello.py內容如下

def greet(str):
return "hello " + str
下面是編譯工具
setup.py內容如下

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["hello.py"]))

3、執行如下打包命令

python setup.py build_ext

執行完該命令后的會有什么變化呢?

首先會在同級目錄下生成hello.c的文件以及一個build文件夾目錄,在build文件夾目錄里面存放着編譯好的.so文件。


接下來來測試一下這個生成.so文件,首先寫一個測試文件demo.py(和hello.py同一級目錄)

from hello import greet
print(greet("tom"))
然后用命令python demo.py執行一下,結果是hello tom,一點都不意外,有同學就問,你這就測試完了嗎。當然沒有啊

其實真正測試之前,我們應該先將hello.py這個文件刪除或者改一下名字,不然我們怎么知道

from hello import greet這條命令中的hello模塊是hello.py文件還是對應生成的.so文件呢

接下來我將hello.py 刪了,將打包編譯生成的.so文件從build文件夾中移出來,移到與demo.py同一級目錄。

接下來再去測試,當然結果仍然返回的是hello tom。這就說明hello模塊是來源於我們的.so文件中。

其實還有一個問題,就是上面測試的是打包一個.so文件,如果有許多個.py文件需要我們打包編譯,是不是要重復的編寫多個setup.py文件,答案是肯定不需要!!!接下來我就說一下如何同時打包多個.py文件

4、如何同時打包多個py文件

上面打包1個.py(hello.py)文件的命令如下:

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["hello.py"]))
現在如果我們有hello1.py,hello2.py,hello3.py,同時想將這么多個.py文件打包成.so文件,這時候我們就可以這樣做,命令如下

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["hello1.py", "hello2.py","hello3.py"]))
其實不管你有多少個.py文件,統一寫到cythonize里面就行了。

好的,本次將.py文件打包成.so文件的寫完了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM