1. 項目打包
1.在根目錄創建python文件: setup, 並放置於根目錄下
from setuptools import setup,find_packages # 導入setup函數並傳參 setup(name='rsa_util', version='0.1.0', description='Python test m', author='xx', author_email='xxx@qq.com', # url='https://ww.python.org/sigs/distuils-sig/', ->此處為發布源 packages=["src"] # py_modules=['tt'] )
2. Terminal下執行命令, 結果如下,該命令將在根目錄下創建一個build文件夾,包含一個子文件夾
lib. lib中包含打包的python文件
python setup.py build
執行結果:
running build
running build_py
package init file 'src\__init__.py' not found (or not a regular file)
creating build
creating build\lib
creating build\lib\src
copying src\rsa_util.py -> build\lib\src
3. Terminal下執行命令,生成.tar.gz文件,同理改變命令可以生成不同格式的壓縮文件
python setup.py sdist
python setup.py bdist_wheel
2. 代碼隱藏:PYC (較弱)
1. 執行如下代碼,將當前目錄下的python文件生成pyc文件
import compileall import sys import os sys.path.append(os.path.abspath(os.path.abspath(__file__) + "\..\..")) sys.path.append(os.path.abspath(os.path.abspath(__file__) + "\..")) local_path = os.path.dirname(os.path.abspath(__file__)) compileall.compile_dir(local_path)
2.如圖所示目錄下生成了PYC文件,形式為字節碼
3.下面嘗試調用rsa_util的pyc文件
在另一個項目的虛擬環境下,將rsa_util.cpython-38復制到項目目錄下,此時Pycharm目錄下不會
顯示Pyc文件。新建一個py文件寫入
from rsa_util import RsaUtil
此時執行會報錯,原因是文件名不對,需要將 rsa_util.cpython-38 更改為 rsa_util 方能正確調用
from rsa_util import RsaUtil RsaUtil = RsaUtil() print(RsaUtil.crypto2("HELLO"))
修改后,Pycharm會在導包處仍顯示錯誤,但是此時再次執行代碼編譯成功。PYC調用成功。
然
ioYckGS65DlwNXuzHYquPkjTkeanft0k7SF7ZWCVwNf509G1Ba+FqdPMG+MTpKZQ47+xwg+GutrbfZDf yPd5ISFbw9HTkr+hDSjPuQbELr9lVo8V/KiuZNO4h6uxjczZnWoHAwkOEEDZL0ik0MKX5NyOmy59c9Vy i1EAuhca3ow= Process finished with exit code 0
然而,Wheel文件是不包含pyc文件的,這意味着無法將pyc打包成wheel實現分發的目的。此外,
PYC很容易被反編譯,所以其代碼隱藏效果很弱。
但是可以通過,手動將Pyc文件替換Py文件達到目的,pyc文件可以被當做py文件調用。需注意是調
用pyc文件時Pycharm解釋器不會提示,需要自己手動輸入。
3. 代碼隱藏:Cython
1. 該方法的原理是將Python文件使用Cython包轉譯成C文件,再將C文件編碼成字節碼形式。達到代
碼隱藏和提高反編譯難度目的。
此段代碼將執行轉譯C的過程,在目錄下生成一個.c的同名文件
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize(["rsa_util.py"]))
此段代碼將執行生成wheel的過程,將.c文件打包成whl文件
from setuptools import setup from setuptools.dist import Distribution from distutils.core import Extension setup(name = 'rsa_util', version = '1.0', ext_modules = [Extension("rsa_util",['rsa_util.c'])], )
最后Terminal分別進行編譯
import os cmd1 = "python generateC.py build_ext" os.system(cmd1) cmd2 = "python CtoWHL.py bdist_wheel" os.system(
2. 在首次執行時,由於Python使用C語言模塊時的環境問題,可能會報錯
error: Unable to find vcvarsall.bat
該問題的產生是在windows環境中,python 的 Setup需要調用一個vcvarsall.bat的文件,該文件
需要安裝c++編程環境才會有。解決方法是安裝Visual Studio,需注意版本問題。在
Anaconda3\Lib\distutils_msvccompiler.py文件中可見如下代碼。版本至少應為VS14以上。
if version >= 14 and version > best_version: best_version, best_dir = version, vc_dir return best_version, best_dir
3. 安裝VS后(需包含Python開發工具包),該報錯解決。編譯成功
編譯后將在setup當前目錄生成build, dist文件夾,在dist文件夾中方可找到whl文件。
whl文件中將包含.pyd文件形如: rsa_util.cp38-win_amd64.pyd ,使用命令 -ztvf rsa_util-
1.0-cp38-cp38-win_amd64.whl 查看whl文件內容
(base) D:\Users\zhangyt03\Desktop\rsa_util\dist>tar -ztvf rsa_util-1.0-cp38- cp38-win_amd64.whl -rw-rw-r-- 0 0 0 66560 8月 25 09:50 rsa_util.cp38-win_amd64.pyd -rw-rw-r-- 0 0 0 66560 8月 25 09:50 src/rsa_util.cp38- win_amd64.pyd -rw-rw-r-- 0 0 0 170 8月 25 09:50 rsa_util-1.0.distinfo/ METADATA -rw-rw-r-- 0 0 0 105 8月 25 09:50 rsa_util-1.0.dist-info/WHEEL -rw-rw-r-- 0 0 0 9 8月 25 09:50 rsa_util-1.0.distinfo/ top_level.txt -rw-rw-r-- 0 0 0 467 8月 25 09:50 rsa_util-1.0.dist-info/RECORD
4.使用pip install 測試
pip install D:\Users\zhangyt03\Desktop\rsa_util\dist\rsa_util-1.0-cp38-cp38-
win_amd64.whl
進行代碼測試
import rsa_util.cp38-win_amd64
導入不成功。其原因是,該文件與.pyc相似,同樣需要將生成的文件名后綴 .cp38-win_amd64 去
除后才可正確調用。此步驟需要用戶進入系統的python虛擬環境中找到包文件夾將其改名。
改名為 rsa_util 后將其放入包rsa中重新調用,並測試
from rsa import rsa_util test1 = rsa_util.RsaUtil() print(test1.crypto2("Helloworld"))
調用成功,字符串被成功加密
C:/Users/zhangyt03/PycharmProjects/pythonProject3/main.py OhV7BvgVXtmNM0puy4CF/5u9ZX8grnLRg83Afdmbxefy6tlNTgBQkwNJifIUM1ANBCX7aZp1OHwq Sp8kCA6V4AKXYRYuWlDjVxge6NmI0VBpkodtp82wS4vu7Z8POEoqaG5M1bhUDTHXi1SKfUanPeTM IOVFOPEhv1Avxt6V5P8= Process finished with exit code 0
最后查看一下.pyd的內容
其反編譯效果遠超pyc文件,可以較好地達到防止源碼泄露的目的。