Python-python打包編譯成pyd或者.so,保護代碼。


2020-05-20

參考:https://blog.csdn.net/qq_39852676/article/details/99842637

https://blog.csdn.net/qq_39852676/article/details/99745224

https://blog.csdn.net/kdongyi/article/details/102678595

 

一、首先為什么要使用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):

from setuptools import setup
# from distutils.core import setup
from Cython.Build import cythonize

setup(
    name='py2c',
    # 打包文件的名稱,默認與py2c.py在同一路徑下
    ext_modules=cythonize('mytest.py'),  
)

 

或者代碼(文件名py2c_2.py):

# -*- coding: utf-8 -*
from distutils.core import setup
from Cython.Build import cythonize

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

    setup(
        name = 'pyd的編譯', # 包名稱
        version = "1.0", # 包版本號
        ext_modules= cpy, # 擴展模塊
        author = "zc",#作者
        author_email='xxx@xxx.com' #作者郵箱
    )

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

 

如何執行:

   在命令行執行如下代碼:

python py2c.py build_ext --inplace
# 或者
python py2c_2.py build_ext --inplace

這兩段代碼生成的文件不太一樣。

在Windows平台執行結果:

 

生成如下文件:

 

 

在Linux平台執行結果:

 

生成如下文件:

第一個運行python py2c.py build_ext --inplace的結果

 

第二個運行python py2c_2.py build_ext --inplace的結果

 

 具體如下:

 

 

三、使用pyd/so庫文件
 在命令行輸入:

python
我用的是
python3

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

import mytest
mytest.main()
mytest.test()

 

注:mytest.main()  其中main()為mytest.py中的一個函數。

結果:

 

————————————————
版權聲明:本文為CSDN博主「清晨的光明」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/kdongyi/article/details/102678595


免責聲明!

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



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