主題: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文件的寫完了