python編譯及打包
0、背景
Python是一種面向對象的解釋型計算機程序設計語言,具有豐富和強大的庫,使用其開發產品快速高效。
python的解釋特性是將py編譯為獨有的二進位編碼pyc文件,然後對pyc中的指令進行解釋執行,但是pyc的反編譯卻非常簡單,可直接反編譯為源碼,當需要將產品發布到外部環境的時候,源碼的保護尤為重要。
基於以上原因,本文將介紹如何將python源碼編譯pyc,編譯成動態鏈接庫.so文件,以及自定義python模塊如何打包發布,以便用pip安裝自己的python模塊。
1、python源碼編譯至pyc文件
使用python的py_compile模塊實現python源碼編譯pyc。
這裡舉一個簡單的例子:在demo文件夾下有一個demo.py,需要將demo.py編譯.pyc。
demo.py內容如下:
def print_hello():
print(hello)
在demo文件夾下新建setup.py,內容如下:
import py_compile
py_compile.compile(rdemo.py,rdemo.pyc)
在shell執行:
cd demo
python setup.py
在demo文件夾下,就會生成demo.pyc文件。
2、python源碼編譯.so文件
Python源碼編譯至.so文件的思路是先將py轉換為c代碼,然後編譯c為so文件。
所需編譯環境:
python安裝:cython
pip install cython
linux 安裝:python-devel,gcc
yum install python-devel
yum install gcc
同樣舉上述例子:在demo文件夾下有一個demo.py,需要將demo.py編譯.so。
demo.py內容如下:
def print_hello():
print(hello)
在demo文件夾下新建setup.py,內容如下:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["demo.py"]))
在shell執行:
cd demo
python setup.py build_ext
在demo文件夾下,就會生成demo.c文件,同時在demo文件夾下生成build文件夾,在build文件夾下包含生成的.so文件。
3、自定義python模塊打包發布
將自定義python模塊打包發布有兩種,一種是將python源碼打包發布,一種是將python源碼轉換至動態鏈接庫.so文件打包發布。下面介紹一下這兩種打包方式。
A)、使用python源碼打包
同樣使用上述例子:在demo文件夾下有一個demo.py,需要將demo.py打包。
在demo文件夾下新建setup.py,內容如下:
from distutils.core import setup
setup(name = 『demo』,
version = 1.0,
py_modules = [demo],
)
在shell執行:
cd demo
python setup.py bdist_wheel
在demo文件夾下,生成dist文件夾,dist文件夾中包含了生成的python模塊。
B)、使用python源碼編譯成.so打包
使用上述例子:在demo文件夾下有一個demo.py,需要將demo.py打包。
首先將python源碼轉換為c代碼:
在demo文件夾下新建generateC.py,內容如下:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["demo.py"]))
然後將c代碼編譯打包,過程如下:
在demo文件夾下新建generateWHL.py,內容如下:
from setuptools import setup
from setuptools.dist import Distribution
from distutils.core import Extension
setup(name = demo,
version = 1.0,
ext_modules = [Extension("demo",[demo.c])],
)
將上述兩個文件執行,如下:在demo文件夾下新建setup.py,內容如下:
import os
cmd1 = "python generateC.py build_ext"
os.system(cmd1)
cmd2 = "python generateWHL.py bdist_wheel"
os.system(cmd2)
在shell執行:
cd demo
python setup.py
在demo文件夾下,生成dist文件夾,dist文件夾中包含了生成的python模塊。
C)、安裝卸載
可以使用pip直接安裝和卸載生成的python模塊。
4、其他
本文主要是針對python源碼編譯打包做了簡單介紹,使用了最簡單的例子。對於複雜的情況,比如打包時需要額外的數據文件,依賴包等等,需要具體查看setuptools模塊的相關內容。
推薦閱讀:
※Pyinstaller打包後運行,程序一閃而過,怎麼解決?
※pandas的索引應統一用 loc & iloc
※Python機器學習實踐—決策樹
※解決 macOS 下 Python 安裝 Dlib 的問題:Cmake 找不到 boost
※如何使用Python求導?