一、首先爲什麼要使用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中的一個函數。