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 buildlib creating buildlibsrc copying src sa_util.py -> buildlibsrc

python 项目打包及分发

3. Terminal下执行命令,生成.tar.gz文件,同理改变命令可以生成不同格式的压缩文件

python setup.py sdist

python 项目打包及分发 

python setup.py bdist_wheel 

 python 项目打包及分发

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文件,形式为字节码

python 项目打包及分发

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,需注意版本问题。在
Anaconda3Libdistutils_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:Userszhangyt03Desktop
sa_utildist>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:Userszhangyt03Desktop
sa_utildist
sa_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的内容

python 项目打包及分发

 其反编译效果远超pyc文件,可以较好地达到防止源码泄露的目的。