Python源代碼保護(Python文件編譯生成pyd/so庫文件)

一、首先爲什麼要使用pyd文件?

        我們知道Python是一門解釋型語言,當我們想讓其他人運行我們的代碼時,如果直接將.py源代碼發送給他人,那麼源代碼將沒有任何安全性可言,也就是任何一個人都可以打開源代碼一看究竟,任何人都可以隨意修改源代碼。因此當我們想保護我們的源代碼(算法保護)或者防止用戶篡改源代碼時,可以將Python源代碼編譯生成.pyd庫文件或者.so庫文件(Windows平臺生成pyd文件,Linux生成so文件)。

事實上,Python和Java的解釋方式是相同的,只是我們表面上看Python是直接解釋源代碼,而實際上python解釋器只會加載字節碼。細心的小夥伴肯定發現了這一點,當我們import某個模塊時,總是會在模塊所在的目錄創建一個__pycache__目錄,裏面存放着被加載模塊的字節碼文件。

Python有以下幾種類型的文件:

  • py:Python控制檯程序的源代碼文件
  • pyw:Python帶用戶界面的源代碼文件
  • pyx:Python包源文件
  • pyc:Python字節碼文件(可通過逆向編譯來得到源碼)
  • pyo:Python優化後的字節碼文件(可通過逆向編譯來得到源碼)
  • pyd:在Windows平臺上Python的庫文件(Python版DLL)
  • so:在Linux平臺上是so文件

二、生成pyd/so庫文件

代碼(文件名py2c.py):

import Cython.Build
import distutils.core

def py2c(file):
    cpy = Cython.Build.cythonize(file) # 返回distutils.extension.Extension對象列表

    distutils.core.setup(
	    name = 'pyd的編譯', # 包名稱
	    version = "1.0",    # 包版本號
	    ext_modules= cpy,     # 擴展模塊
	    author = "kdongyi",#作者
	    author_email='[email protected]'#作者郵箱
	)

if __name__ == '__main__':
	
    file = "train_gpu.py"
    py2c(file)

如何執行:

  在命令行執行如下代碼:

python py2c.py build_ext --inplace

在Windows平臺執行結果:

生成如下文件:

在Linux平臺執行結果:

生成如下文件:

三、使用pyd/so庫文件

 在命令行輸入:

python

然後導入我們生成的庫文件模塊:

import train_gpu
train_gpu.main()

注:train_gpu.main()  其中main()爲train_gpu.py中的一個函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章