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
