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求導?

TAG:Python | 機器學習 | Python入門 |