使用Cython對python代碼編譯

背景:  

  我們知道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文件

步驟:

1、安裝Cython

pip install Cython

2、編寫轉換文件

文件名py_to_pyd.py

import Cython.Build
import distutils.core
 
def py_to_pyd(file):
    cpy = Cython.Build.cythonize(file) # 返回distutils.extension.Extension對象列表
 
    distutils.core.setup(
        name = 'pyd的編譯', # 包名稱
        version = "1.0",    # 包版本號
        ext_modules= cpy,     # 擴展模塊
        author = "",#作者
        author_email=""#作者郵箱
    )
 
if __name__ == '__main__':
    
    file = "test.py"  #需要編譯的文件
    py_to_pyd(file)

3、執行轉換

python py_to_pyd.py build_ext --inplace

3.1 在windows下執行:

 

 執行完生成文件:

 

 其中say_hello.c是中間文件,不用關心,直接刪除

say_hello.cp36-win_amd64.pyd 就是我們要的編譯後文件,windows下生成的是pyd文件。

測試一下:

1、先刪除say_hello.c和say_hello.py文件

2、測試編譯後的包能否導入和調用文件中方法

 

 

  測試完成,沒有問題,可以將名稱改爲say_hello.pyd,也可以不改,經測試都能引入並調用。

3.2 Linux下執行

 

 執行會生成:say_hello.cpython-36m-x86_64-linux-gnu.so

測試一下:

1、先刪除say_hello.c和say_hello.py文件

2、測試編譯後的包能否導入和調用文件中方法

 測試完成,沒有問題,可以將名稱改爲say_hello.so,也可以不改,經測試都能引入並調用。

 會遇到的問題

1、執行編譯命令:

python py_to_pyd.py build_ext --inplace

報錯1:Unable to find vcvarsall.bat

原因:缺少Visual C++

解決:

1、下載Visual C++ Build Tools 2015,地址:http://go.microsoft.com/fwlink/?LinkId=691126

  文件名爲:visualcppbuildtools_full.exe

2、雙擊安裝該exe

  

 

   如果中間出現:安裝包丟失或損環,一般情況下這種安裝方式都會報錯,需要進行下面步驟

  

 3、下載完整版  

   則需要下載:solved_packageMissInInstalling_mu_visual_cpp_build_tools_2015_update_3_x64_dvd_dfd9a39c.iso,

  地址:https://www.kdocs.cn/sharing/sharefolder

  下載之後解壓雙擊iso,再雙擊exe安裝即可

 報錯2:error: command 'cl.exe' failed: No such file or directory

再次執行編譯命令:

python py_to_pyd.py build_ext --inplace

提示:error: command 'cl.exe' failed: No such file or directory

出現這個錯誤,一般是從pycharm的命令行或者cmd或者powershell直接執行上面命令的,

執行這個命令需要從c++的命令窗口內執行,

找到Microsoft Visual C++ Build Tools安裝目錄,如我的:C:\Program Files (x86)\Microsoft Visual C++ Build Tools

  • 對於 32 位 Python,請使用Visual C++ 2015 x86 Native Build Tools Command Prompt
  • 對於 64 位 Python,使用Visual C++ 2015 x64 Native Build Tools Command Prompt

雙擊打開窗口,再執行命令,如 3.1 在windows下執行 步驟中的插圖。

 參考:

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

https://blog.csdn.net/colleges/article/details/123769410 (報錯1:Unable to find vcvarsall.bat)

https://stackoverflow.com/questions/41724445/python-pip-on-windows-command-cl-exe-failed(報錯2:error: command 'cl.exe' failed: No such file or directory)

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