Cython保護Python代碼


注:.pyc也有一定的保護性,容易被反編譯出源碼...

 

項目發布時,為防止源碼泄露,需要對源碼進行一定的保護機制,本文使用Cython將.py文件轉為.so進行保護。這一方法,雖仍能被反編譯,但難度會比較大。另外,Cython是Python的超集。

自行安裝Cython

 

1,創建complie.py文件

from Cython.Build import cythonize
from Cython.Distutils import build_ext
from setuptools import setup
from setuptools.extension import Extension

setup(
ext_modules=cythonize(
[
Extension('project.*', ['project/*.py']),
Extension('project.api.*', ['project/api/*.py']),
Extension('project.api.bizs.*', ['project/api/bizs/*.py']),
Extension('project.api.data.export*', ['project/api/data/export/*.py']),
Extension('project.api.exceptions.*', ['project/api/exceptions/*.py']),
# 需要保護的.py文件目錄寫在此處
],
build_dir='build',
compiler_directives=dict(
always_allow_keywords=True, language_level=3
)
),
cmdclass=dict(
build_ext=build_ext
)
)

language_level代表python版本,python2就寫2

 

2,運行命令:python compile.py build_ext --inplace

 將會在各目錄生成每個.py文件的.so文件,和一個build文件夾。.py文件已經被保護了,.so文件之間可以相互調用。

部署時刪除項目中.py文件、build文件夾。

 

如果項目中使用了celery,注意不要編譯celery代碼,否則celery將無法使用。

貼一個shell腳本,配合上段代碼使用。

#!/bin/bash

# 清除緩存目錄
find . -type d -name __pycache__ | xargs rm -rf

# 編譯代碼
python3 -m venv env
sh env/bin/activate
python3 compile.py build_ext --inplace
if [ $? -ne 0 ]; then
    exit 1
fi


# 更改celery文件
mv ./project/api/tasks/cele/__init__.py ./project/api/tasks/cele/__init__.py.bak
mv ./project/api/tasks/cele/base.py ./project/api/tasks/cele/base.py.bak
mv ./project/api/tasks/cele/export.py ./project/api/tasks/cele/export.py.bak
mv ./project/api/tasks/__init__.py ./project/api/tasks/__init__.py.bak
mv ./project/api/tasks/dispatch_subdomain.py ./project/api/tasks/dispatch_subdomain.py.bak
mv ./project/api/tasks/recognize_area.py ./project/api/tasks/recognize_area.py.bak


# 將.so文件改名
find ./project  -name '*.so' | awk -F '.cpython-36m-x86_64-linux-gnu' '{print "mv "$0" "$1$2}' | sh

# 刪除.py文件
find ./project  -name '*.py' | xargs rm -f

mv ./project/api/tasks/cele/__init__.py.bak ./project/api/tasks/cele/__init__.py
mv ./project/api/tasks/cele/base.py.bak ./project/api/tasks/cele/base.py
mv ./project/api/tasks/cele/export.py.bak ./project/api/tasks/cele/export.py
mv ./project/api/tasks/__init__.py.bak ./project/api/tasks/__init__.py
mv ./project/api/tasks/dispatch_subdomain.py.bak ./project/api/tasks/dispatch_subdomain.py
mv ./project/api/tasks/recognize_area.py.bak ./project/api/tasks/recognize_area.py

# 清除不需要的文件
rm -rf build
rm -f .gitignore
rm -f compile.py
rm -f build.sh

 

END!


免責聲明!

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



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