• Python Setuptools的 setup.py


    Python 的 setup.py

    背景

    pip 是最主流的包管理方案,使用

    pip install xxx
    
    • 1

    pip 无法正常下载Python模块,或者需要在离线环境及无网络环境安装Python包的时候,可以采用安装 .whl文件或者setup.py文件的方式。

    一般的可以在下面的这个网站找到: https://pypi.org/

    下载对应的包的whl文件,然后执行

     pip install XXX.whl
    
    • 1

    在安装普通的python包时,利用pip工具相当简单。采用setup.py去构建环境,将自己写的模块以及相应的依赖库一起打包,用setup去完成这个任务。 所以很多github代码都提供setup.py方便我们一键安装

    如果您下载的软件包在根文件夹中具有“ setup.py”,则可以通过运行以下命令进行安装:

    python setup.py install
    
    • 1

    如果你想安装一个模块但又不想安装pip,那么唯一的选择就是从setup.py文件安装模块。这可以通过python setup.py install。

    什么是setup.py、setuptools

    官网:Building and Distributing Packages with Setuptools
    参考URL: https://setuptools.pypa.io/en/latest/setuptools.html

    setup.py是一个 python 文件,它的存在表明您要安装的模块/包可能已经用 Setuptools 打包和分发,这是分发 Python 模块的标准。 它的目的是正确安装软件。

    setuptools是python自带的用来构建包的工具,构建出来的wheel(.whl)可供其他人pip install和import。

    总之,setuptools就是比distutils好用的多,基本满足大型项目的安装和发布!

    一个最基本的”setup.py”文件如下:

    #coding:utf8
    from setuptools import setup
    setup(
       name='MyApp',        # 项目名
       version='1.0',       # 版本号
       packages=['myapp']   # 包括在安装包内的Python包
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    什么是setuptools

    setuptools官方文档:https://setuptools.readthedocs.io

    distutils 是标准库中负责建立 Python 第三方库的安装器,使用它能够进行 Python 模块的安装和发布。

    setuptools 是 distutils 增强版,不包括在标准库中。其扩展了很多功能,能够帮助开发者更好的创建和分发 Python 包。大部分 Python 用户都会使用更先进的 setuptools 模块。

    Setuptools 提供一流的setup.py文件支持作为配置机制。setup.py 调用了 setuptools 包中的setup方法。

    然而,重要的是要记住,强烈建议不要将此文件作为脚本(例如)运行,并且大多数命令行界面已经(或将要)弃用 (例如,…)。python setup.py sdistpython setup.py installpython setup.py bdist_wininst

    ** 我们还建议用户通过pyproject.tomlsetup.cfg以更具声明性的方式公开尽可能多的配置,并仅使用动态部分保持最小化(如果适用,甚至完全省略)**。setup.py有关更多背景信息,请参阅为什么不应该直接调用 setup.py

    setup.py命令

    查看所有支持的命令:

    python setup.py --help-commands
    
    • 1

    构建安装时所需的所有内容:

    python setup.py build
    
    • 1

    安装包到系统环境中。该命令会将当前项目安装到当前Python环境的”site-packages”目录下,这样其他项目就可以像导入标准库一样导入该项目的代码了。

    python setup.py install
    
    • 1

    以开发方式安装包:
    如果项目在开发过程中会频繁变更,每次安装还需要先将原来的版本卸掉,会很麻烦。使用”develop”开发方式安装的话,项目代码不会真的被拷贝到本地Python环境的”site-packages”目录下,而是在”site-packages”目录里创建一个指向当前项目位置的链接。这样如果当前位置的源码被改动,就会马上反映到”site-packages”里。

    python setup.py develop
    
    • 1

    用于包的上传发布:

    python setup.py register
    
    • 1

    setup.py内容

    生成可执行文件的分发(安装到指定路径)

    参考URL: https://amir.rachum.com/blog/2017/07/28/python-entry-points/

    网上demo:

    # 用来支持自动生成脚本,安装后会自动生成 /usr/bin/pmm 的可执行文件(windows管理员权限下会在Python文件夹的script里面生成pmm.exe)
    # 该文件入口指向 pimm/pimm_module.py 的main 函数
    entry_points={'console_scripts': ['pmm=pimm.pimm_module:main']},
     
    # 将 bin/foo.sh 和 bar.py 脚本,生成到系统 PATH中
    # 执行 python setup.py install 后
    # 会生成 如 /usr/bin/foo.sh 和 如 /usr/bin/bar.py
    scripts=['bin/foo.sh', 'bar.py']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    将python模块转变为命令行工具:
    如果我们希望 module 中的函数不仅仅只是被其他 python 程序通过 import 调用,还可以直接在命令行中执行,那么可以做如下修改:(设置参数entry_points里的’console_scripts’)

    # greeting_module.py
    import pyjokes
    
    def greeting_func(name):
        print("Hello,", name)
        print("Here is a joke for you:\n", pyjokes.get_joke())
    
    def main():
        import sys
        arg = sys.argv[1]
        greeting_func(arg)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    # setup.py 
    from setuptools import setup, find_packages
    
    setup(
    	# ...,
        entry_points={       # 设置了在命令行中如何使用greeting_module中的main函数
            'console_scripts': [
                'greeting=greeting_pkg.greeting_module:main'	# =.:
            ]
        }
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    引入非Python文件

    如果想引入静态文件,如JS、CSS、图片等,怎么做?
    在项目根目录下添加一个”MANIFEST.in”文件夹。假设我们把所有静态文件都放在”static”子目录下,

    我们在清单文件”MANIFEST.in”中,列出想要在包内引入的目录路径:

    recursive-include myapp/static *
    recursive-include myapp/xxx *
    
    • 1
    • 2

    recursive-include表明包含子目录。

    在”setup.py”中将include_package_data参数设为True:

    #coding:utf8
    from setuptools import setup
    setup(
       name='MyApp',        # 项目名
       version='1.0',# 版本号
       packages=['myapp'],  # 包括在安装包内的Python包
       include_package_data=True   # 启用清单文件MANIFEST.in
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果你想排除一部分文件,可以在”setup.py”中使用exclude_package_date参数:

    setup(
        ...
        include_package_data=True, # 启用清单文件MANIFEST.in
        exclude_package_date={'':['.gitignore']}
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    依赖管理

    我们的项目会依赖其他Python模块,如何在setup.py中管理这些依赖呢?

    修改”setup.py”文件,加入install_requires参数:

    #coding:utf8
    from setuptools import setup
    setup(
       name='MyApp',        # 项目名
       version='1.0',# 版本号
       packages=['myapp'],  # 包括在安装包内的Python包
       include_package_data=True,   # 启用清单文件MANIFEST.in
       exclude_package_date={'':['.gitignore']},
       install_requires=[   # 依赖列表
           'Flask>=0.10',
           'Flask-SQLAlchemy>=1.5,<=2.1'
       ]
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    可以通过dependency_links指定依赖包下载路径。install_requires中的包在安装时会先去PyPI下载并安装,如果包在PyPI中找不到,则会从dependency_links标识的URL中获取:

    setup(
       ...
       install_requires=[   # 依赖列表
           'Flask>=0.10',
           'Flask-SQLAlchemy>=1.5,<=2.1'
       ],
    
       dependency_links=[   # 依赖包下载路径
           'http://example.com/dependency.tar.gz'
       ]
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    路径应指向一个”egg”包或”tar.gz”包,也可以是个包含下载地址(一个”egg”包或”tar.gz”包)的页面。

    编写 setup.py 文件, setup.py是python模块分发与安装的指导文件。
    有了setup.py文件,运行下面这条命令,可以进行模块的安装。
    与 .whl文件一样,先cmd到指定位置,然后输入:

    python setup.py install
    
    • 1

    安装

    $ pip install setuptools
    
    • 1
  • 相关阅读:
    一、【VUE-CLI】Vue CLI 脚手架介绍及安装
    Editor扩展常用API
    excel文档打不开怎么修复?
    备战金九银十,Java研发面试题+答案整合PDF,走到哪刷到哪
    为什么要学习Flink系统管理及优化课程?
    政府引导基金管理平台,携手政府成就资本与产业的“双向奔赴”!
    [附源码]计算机毕业设计校园招聘微信小程序Springboot程序
    关于请求和重定向的路径问题
    网络安全(黑客技术)—高效自学
    大数据学习(3)-hive分区表与分桶表
  • 原文地址:https://blog.csdn.net/inthat/article/details/128078724