python 項目打包及分發


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文件,可以較好地達到防止源碼泄露的目的。

 


免責聲明!

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



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