1. 程式人生 > 實用技巧 >編譯python原始碼

編譯python原始碼

編譯python原始碼

參考連結:

https://blog.csdn.net/feijiges/article/details/77932382

https://www.icode9.com/content-1-644421.html

https://www.cnblogs.com/jclian91/p/10289820.html

https://mp.weixin.qq.com/s/TTUFQRQ_DiKktJ5-J8O8Pg

前提說明

僅可加密.py結尾的python檔案。

由於windows版本執行加密原始碼的命令會存在一定的問題,所以以下場景都是在linux環境上做的。

windows上執行原始碼加密出現的問題:

1、無法加密__init__.py檔案,如果要加密會報錯。

2、無法加密django的資料遷移檔案,即migrations目錄下的0***_initial.py等

3、批量加密目錄下的檔案時預設輸出是無序的(不是按照原目錄結構方式輸出)。

加密

依賴

pip3 install cython

加密命令

python setup.py build_ext

加密單個檔案

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

# 相對路徑:task.py和setup.py隸屬於同一目錄
setup(ext_modules=cythonize('
task.py')) # 相對路徑:task.py和src在同一目錄 #setup(ext_modules=cythonize('src/task.py')) # 絕對路徑:task.py和src在同一目錄 #setup(ext_modules=cythonize('/var/mycode/src/task.py'))

加密的結果就是在當前目錄下生成build資料夾,在linux系統下生成的加密檔案是以so結尾的,而在windows下生成的是以pyd結尾的檔案。

目錄結構如下:

加密單個檔案

# setup.py

import os

# 獲取當前檔案父目錄下的子目錄
src_path = []
path 
= os.path.dirname(os.path.abspath(__file__)) for p in os.listdir(path): p_inner = os.path.join(path, p) if os.path.isdir(p_inner): src_path.append(p_inner) # 遞迴獲取src_path裡每個目錄裡的要編譯的py檔案 py_files = [os.path.join(path, file_name) for compile_path in src_path for path, _, file_list in os.walk(compile_path) for file_name in file_list if file_name.endswith('.py')] print(py_files) from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize(py_files))

加密整個專案(例如:Django)

src_dir = '/home/liuwei/mycode/project'
to_encrypt = [os.path.join(path, file_name)
              for path, _, file_list in os.walk(src_dir)
              for file_name in file_list if file_name.endswith('.py')]

setup(ext_modules=cythonize(to_encrypt))

python setup.py build_ext