zoukankan      html  css  js  c++  java
  • 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

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

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

  • 相关阅读:
    redis安装
    redis的使用场景和基本数据类型
    (传输层)tcp协议
    async/await
    Promise对象
    对称加密与非对称加密
    Js遍历数组总结
    HTTPS加密传输过程
    HTML节点操作
    Js的new运算符
  • 原文地址:https://www.cnblogs.com/champaign/p/15190377.html
Copyright © 2011-2022 走看看