目录
1. 为什么需要对项目分发打包?
2. 包分发的始祖:distutils
3. 分发工具升级:setuptools
4. easy_install 使用指南
5. 源码包与二进制包什么区别?
以源码包的方式发布
以二进制包形式发布
eggs 与 wheels 有什么区别?
下面进入正题:setup.py
1. 超详细讲解 setup.py 的编写
 关于安装环境的限制
 关于依赖包下载安装
 关于文件的分发
关于程序分类信息
2.生成可执行文件的分发
指定release
3. 如何使用 setup.py 构建包
4. 如何使用 setup.py 安装包
5. 如何发布包到 PyPi?
首页 后端开发 Python教程 如何使用Python中的setup.py文件?

如何使用Python中的setup.py文件?

May 09, 2023 pm 07:07 PM
python setup.py

1. 为什么需要对项目分发打包?

平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而这个过程就是  打包

打包,就是将你的源代码进一步封装,并且将所有的部署工作都事先安排好,这样使用者拿到后即装即用,不用再操心如何部署的问题(如果你不想对照着一堆部署文档手工操作的话)。

Python 发展了这么些年了,项目打包工具也已经很成熟了。他们都有哪些呢?

你可能听过 disutils、 distutils 、distutils2、setuptools等等,好像很熟悉,却又很陌生,他们都是什么关系呢?

2. 包分发的始祖:distutils

distutils 是 Python 的一个标准库,从命名上很容易看出它是一个分发(distribute)工具(utlis),它是 Python  官方开发的一个分发打包工具,所有后续的打包工具,全部都是基于它进行开发的。

distutils 的精髓在于编写 setup.py,它是模块分发与安装的指导文件。

那么如何编写 setup.py 呢?这里面的内容非常多,我会在后面进行详细的解析,请你耐心往下看。

你有可能没写过 setup.py ,但你绝对使用过 setup.py 来做一些事情,比如下面这条命令,我们经常用它来进行模块的安装。

$ python setup.py install
登录后复制

这样的安装方法叫源码安装,与之对应的是通过二进制软件包安装,同样我也会在后面进行介绍。

3. 分发工具升级:setuptools

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

distribute,或许你在其他地方也见过它,这里也提一下。

distribute 是 setuptools 有一个分支版本,分支的原因可能是有一部分开发者认为 setuptools 开发太慢了。但现在,distribute 又合并回了 setuptools 中。因此,我们可以认为它们是同一个东西。

还有一个大包分发工具是 distutils2,其试图尝试充分利用distutils,detuptools 和 distribute 并成为 Python 标准库中的标准工具。但该计划并没有达到预期的目的,且已经是一个废弃的项目。

因此,setuptools 是一个优秀的,可靠的 Python 包安装与分发工具。

通过pycharm创建虚拟环境时,都会默认安装setuptools工具。

4. easy_install 使用指南

当你安装完 setuptools 后,就拥有了一个叫做 easy_install 的第三方管理工具,这也是它区分于 distutils 的一大改进。

这里简单介绍一下它的用法,虽然它已经用得非常少了。

先是包的安装

安装
# 通过包名,从PyPI寻找最新版本,自动下载、编译、安装 
$ easy_install pkg_name  
# 通过包名从指定下载页寻找链接来安装或升级包 
$ easy_install -f http://pythonpaste.org/package_index.html   
# 指定线上的包地址安装 
$ easy_install http://example.com/path/to/MyPackage-1.2.3.tgz  
# 从本地的 .egg 文件安装 
$ easy_install xxx.egg  
# 在安装时你可以添加额外的参数 指定安装目录:--install-dir=DIR, -d DIR 指定用户安装:--user
 
升级
# 从 pypi 中搜索并升级包 
$ easy_install --upgrade pkg_name  
# 指定版本进行升级 
$ easy_install "SomePackage==2.0"

删除
$ easy_install -m pkg_name
登录后复制

总结一句:setuptools 是官方提供的一个专业用于包分发的工具,若只从安装的角度来看,它的功能确实简单。它更大的意义是对包的分发很有用,定制化程序非常高,我们现在也还在用它进行版本包的发布。

5. 源码包与二进制包什么区别?

Python 包的分发可以分为两种:

以源码包的方式发布

以二进制包形式发布

以源码包的方式发布

安装以源码包方式发布的包的过程,是先解压,再编译,最后才安装(上面提到的python setup.py install),所以它是跨平台的,由于每次安装都要进行编译,相对二进包安装方式来说安装速度较慢。

源码包的本质是一个压缩包,其常见的格式有:

python中的setup.py怎么使用

以二进制包形式发布

二进制包的安装过程省去了编译的过程,直接进行解压安装,所以安装速度较源码包来说更快。

由于不同平台的编译出来的包无法通用,所以在发布时,需事先编译好多个平台的包。

二进制包的常见格式有:

python中的setup.py怎么使用

eggs 与 wheels 有什么区别?

Egg 格式是由 setuptools 在 2004 年引入,而 Wheel 格式是由 PEP427 在 2012 年定义。Wheel 的出现是为了替代 Egg,它的本质是一个zip包,其现在被认为是 Python 的二进制包的标准格式。

以下是 Wheel 和 Egg 的主要区别:

  • Wheel 有一个官方的 PEP427 来定义,而 Egg 没有 PEP 定义

  • Wheel 是一种分发格式,即打包格式。而 Egg 既是一种分发格式,也是一种运行时安装的格式,并且是可以被直接 import

  • Wheel 文件不会包含 .pyc 文件

  • Wheel 使用和 PEP376 兼容的 .dist-info 目录,而 Egg 使用 .egg-info 目录

  • Wheel 有着更丰富的命名规则。

  • Wheel 是有版本的。每个 Wheel 文件都包含 wheel 规范的版本和打包的实现

  • Wheel 在内部被 sysconfig path type 管理,因此转向其他格式也更容易

  • wheel 包可以通过 pip 来安装,只不过需要先安装 wheel 模块,然后再使用 pip 的命令。

$ pip install wheel $ pip wheel --wheel-dir=/local/wheels pkg
登录后复制

下面进入正题:setup.py

1. 超详细讲解 setup.py 的编写

打包分发最关键的一步是编写 setup.py 文件。

以下是一个 setup.py 简单的使用示例

from setuptools import setup, find_packages
  setup(            
     name="mytest",     
     version="1.0",     
     author="name",     
     author_email="name@163.com",    
     # 项目地址 
     url="https://github.com/test/mytest",
     description="Learn to Pack Python Module",             
     # 你要安装的包,通过 setuptools.find_packages 自动发现当前目录下有哪些包     
     packages=find_packages()
)
登录后复制

接下来,我将慢慢扩充这个setup函数,增加更多的参数,以便你能理解setup函数能做哪些事情。

关于安装环境的限制

有些库并不是在所有的 Python 版本中都适用的,若一个库安装在一个未兼容的 Python 环境中,理论上不应该在使用时才报错,而应该在安装过程就使其失败,提示禁止安装。

这可以使用 python_requires 来实现。

setup(     
    ...     
    python_requires=&#39;>=2.7, <=3&#39;, 
)
登录后复制

关于依赖包下载安装

from setuptools import setup, find_packages   
setup(     
    ...      
    # 表明当前模块依赖哪些包,若环境中没有,则会从pypi中下载安装     
    install_requires=[&#39;docutils>=0.3&#39;],      
    # setup.py 本身要依赖的包,这通常是为一些setuptools的插件准备的配置    
    # 这里列出的包,不会自动安装。     
    setup_requires=[&#39;pbr&#39;],      
    # 仅在测试时需要使用的依赖,在正常发布的代码中是没有用的。     
    # 在执行python setup.py test时,可以自动安装这三个库,确保测试的正常运行。     
    tests_require=[         
        &#39;pytest>=3.3.1&#39;,         
        &#39;pytest-cov>=2.5.1&#39;,     
    ],      
    # 用于安装setup_requires或tests_require里的软件包     
    # 这些信息会写入egg的 metadata 信息中    
     dependency_links=[         
        "http://example2.com/p/foobar-1.0.tar.gz",     
     ],      
    # install_requires 在安装模块时会自动安装依赖包     
    # 而 extras_require 不会,这里仅表示该模块会依赖这些包     
    # 但是这些包通常不会使用到,只有当你深度使用模块时,才会用到,这里需要你手动安装    
     extras_require={        
        &#39;PDF&#39;:  ["ReportLab>=1.2", "RXP"],         
        &#39;reST&#39;: ["docutils>=0.3"],    
     } 
)
登录后复制

关于文件的分发

from setuptools import setup, find_packages   
setup(     
    name="mytest",    
    version="1.0",    
    author="name",    
    author_email="name@163.com",     
    description="Learn to Pack Python Module",     
    url="https://github.com/test/mytest",  
    packages=find_packages(),     
    # 安装过程中,需要安装的静态文件,如配置文件、service文件、图片等     
    data_files=        
        [         
            (&#39;&#39;, [&#39;conf/*.conf&#39;]),         
            (&#39;/usr/lib/systemd/system/&#39;, [&#39;bin/*.service&#39;]),               
        ],     
    # 希望被打包的文件     
    package_data={
        &#39;&#39;:[&#39;*.txt&#39;],         
        &#39;bandwidth_reporter&#39;:[&#39;*.txt&#39;]                
    },     
    # 不打包某些文件    
     exclude_package_data={         
        &#39;bandwidth_reporter&#39;:[&#39;*.txt&#39;]                
    } 
)
登录后复制

关于程序分类信息

classifiers 参数说明包的分类信息。

示例:

from setuptools import setup, find_packages  
setup(     
    classifiers = [         
        # 发展时期,常见的如下         
        #   3 - Alpha         
        #   4 - Beta         
        #   5 - Production/Stable         
        &#39;Development Status :: 3 - Alpha&#39;,          
        # 开发的目标用户         
        &#39;Intended Audience :: Developers&#39;,          
        # 属于什么类型         
        &#39;Topic :: Software Development :: Build Tools&#39;,          
        # 许可证信息         
        &#39;License :: OSI Approved :: MIT License&#39;,          
        # 目标 Python 版本         
        &#39;Programming Language :: Python :: 2&#39;,         
        &#39;Programming Language :: Python :: 2.7&#39;,         
        &#39;Programming Language :: Python :: 3&#39;,         
        &#39;Programming Language :: Python :: 3.3&#39;,         
        &#39;Programming Language :: Python :: 3.4&#39;,         
        &#39;Programming Language :: Python :: 3.5&#39;,     
    ] 
)
登录后复制

2.生成可执行文件的分发

from setuptools import setup, find_packages   
setup(     
    ...   
    # 用来支持自动生成脚本,安装后会自动生成 /usr/bin/foo 的可执行文件     
    # 该文件入口指向 foo/main.py 的main 函数     
    entry_points={         
        &#39;console_scripts&#39;: [             
            &#39;foo = foo.main:main&#39;         
        ]     
    },      
    # 将 bin/foo.sh 和 bar.py 脚本,生成到系统 PATH中     
    # 执行 python setup.py install 后会生成 如 /usr/bin/foo.sh 和 如 /usr/bin/bar.py     
    scripts=[&#39;bin/foo.sh&#39;, &#39;bar.py&#39;]
)
登录后复制

上面的 scripts 里有的脚本中有 sh 和 py 后缀,那么安装后,setuptools 会原封不动的移动到 /usr/bin 中,并添加可执行权限。

指定release

setup.py 里只能指定 version,而不能指定 release,如果你需要变更版本号,可以使用 --release 参数进行指定

python setup.py bdist_rpm --release=20200617
登录后复制

setup.py 的参数非常多,能够不借助文档写好一个setup.py好像没那么简单。为了备忘,我整理了 setup 函数常用的一些参数:

python中的setup.py怎么使用

3. 如何使用 setup.py 构建包

a、构建源码发布包。

用于发布一个 Python 模块或项目,将源码打包成 tar.gz (用于 Linux 环境中)或者 zip 压缩包(用于 Windows 环境中)

$ python setup.py sdist
登录后复制

那这种包如何安装呢?

答案是,使用下一节即将介绍的 setuptools 中提供的 easy_install 工具。

$ easy_install xxx.tar.gz
登录后复制

使用 sdist 将根据当前平台创建默认格式的存档。在类 Unix 平台上,将创建后缀后为 .tar.gz 的 gzip 压缩的tar文件分发包,而在Windows上为 ZIP 文件。

当然,你也可以通过指定你要的发布包格式来打破这个默认行为

$ python setup.py sdist --formats=gztar,zip
登录后复制

你可以指定的格式有哪些呢?

创建一个压缩的tarball和一个zip文件。可用格式为:

python中的setup.py怎么使用

对以上的格式,有几点需要注意一下:

  • 在版本3.5中才添加了对 xztar 格式的支持

  • zip 格式需要你事先已安装相应的模块:zip程序或zipfile模块(已成为Python的标准库)

  • ztar 格式正在弃用,请尽量不要使用

另外,如果您希望归档文件的所有文件归root拥有,可以这样指定

python setup.py sdist --owner=root --group=root
登录后复制

b、构建二进制分发包。

在windows中我们习惯了双击 exe 进行软件的安装,Python 模块的安装也同样支持 打包成 exe 这样的二进制软件包。

$ python setup.py bdist_wininst
登录后复制

而在 Linux 中,大家也习惯了使用 rpm 来安装包,对此你可以使用这条命令实现 rpm 包的构建

$ python setup.py bdist_rpm
登录后复制

若你喜欢使用 easy_install 或者 pip 来安装离线包。你可以将其打包成 egg 包

$ python setup.py bdist_egg
登录后复制

若你的项目,需要安装多个平台下,既有 Windows 也有 Linux,按照上面的方法,多种格式我们要执行多次命令,为了方便,你可以一步到位,执行如下这条命令,即可生成多个格式的进制包

$ python setup.py bdist
登录后复制

4. 如何使用 setup.py 安装包

正常情况下,我们都是通过以上构建的源码包或者二进制包进行模块的安装。

但在编写 setup.py 的过程中,可能不能一步到位,需要多次调试,这时候如何测试自己写的 setup.py 文件是可用的呢?

这时候你可以使用python setup.py install命令,它会将你的模块安装至系统全局环境中.

如若你的项目还处于开发阶段,频繁的安装模块,也是一个麻烦事。

这时候你可以使用这条命令安装,该方法不会真正的安装包,而是在系统环境中创建一个软链接指向包实际所在目录。这边在修改包之后不用再安装就能生效,便于调试。

$ python setup.py develop
登录后复制

5. 如何发布包到 PyPi?

通过上面的学习,你一定已经学会了如何打包自己的项目,若你觉得自己开发的模块非常不错,想要 share 给其他人使用,你可以将其上传到 PyPi (Python Package Index)上,它是 Python 官方维护的第三方包仓库,用于统一存储和管理开发者发布的 Python 包。

如果要发布自己的包,需要先到 pypi 上注册账号。然后创建 ~/.pypirc 文件,此文件中配置 PyPI 访问地址和账号。如的.pypirc文件内容请根据自己的账号来修改。

典型的 .pypirc 文件

[distutils] 
index-servers = pypi  
[pypi] 
username:xxx password:xxx
登录后复制

然后使用这条命令进行信息注册,完成后,你可以在 PyPi 上看到项目信息。

$ python setup.py register
登录后复制

注册完了后,你还要上传源码包,别人才使用下载安装

$ python setup.py upload
登录后复制

以上是如何使用Python中的setup.py文件?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

mysql 是否要付费 mysql 是否要付费 Apr 08, 2025 pm 05:36 PM

MySQL 有免费的社区版和收费的企业版。社区版可免费使用和修改,但支持有限,适合稳定性要求不高、技术能力强的应用。企业版提供全面商业支持,适合需要稳定可靠、高性能数据库且愿意为支持买单的应用。选择版本时考虑的因素包括应用关键性、预算和技术技能。没有完美的选项,只有最合适的方案,需根据具体情况谨慎选择。

mysql安装后怎么使用 mysql安装后怎么使用 Apr 08, 2025 am 11:48 AM

文章介绍了MySQL数据库的上手操作。首先,需安装MySQL客户端,如MySQLWorkbench或命令行客户端。1.使用mysql-uroot-p命令连接服务器,并使用root账户密码登录;2.使用CREATEDATABASE创建数据库,USE选择数据库;3.使用CREATETABLE创建表,定义字段及数据类型;4.使用INSERTINTO插入数据,SELECT查询数据,UPDATE更新数据,DELETE删除数据。熟练掌握这些步骤,并学习处理常见问题和优化数据库性能,才能高效使用MySQL。

mysql 需要互联网吗 mysql 需要互联网吗 Apr 08, 2025 pm 02:18 PM

MySQL 可在无需网络连接的情况下运行,进行基本的数据存储和管理。但是,对于与其他系统交互、远程访问或使用高级功能(如复制和集群)的情况,则需要网络连接。此外,安全措施(如防火墙)、性能优化(选择合适的网络连接)和数据备份对于连接到互联网的 MySQL 数据库至关重要。

如何针对高负载应用程序优化 MySQL 性能? 如何针对高负载应用程序优化 MySQL 性能? Apr 08, 2025 pm 06:03 PM

MySQL数据库性能优化指南在资源密集型应用中,MySQL数据库扮演着至关重要的角色,负责管理海量事务。然而,随着应用规模的扩大,数据库性能瓶颈往往成为制约因素。本文将探讨一系列行之有效的MySQL性能优化策略,确保您的应用在高负载下依然保持高效响应。我们将结合实际案例,深入讲解索引、查询优化、数据库设计以及缓存等关键技术。1.数据库架构设计优化合理的数据库架构是MySQL性能优化的基石。以下是一些核心原则:选择合适的数据类型选择最小的、符合需求的数据类型,既能节省存储空间,又能提升数据处理速度

HadiDB:Python 中的轻量级、可水平扩展的数据库 HadiDB:Python 中的轻量级、可水平扩展的数据库 Apr 08, 2025 pm 06:12 PM

HadiDB:轻量级、高水平可扩展的Python数据库HadiDB(hadidb)是一个用Python编写的轻量级数据库,具备高度水平的可扩展性。安装HadiDB使用pip安装:pipinstallhadidb用户管理创建用户:createuser()方法创建一个新用户。authentication()方法验证用户身份。fromhadidb.operationimportuseruser_obj=user("admin","admin")user_obj.

Navicat查看MongoDB数据库密码的方法 Navicat查看MongoDB数据库密码的方法 Apr 08, 2025 pm 09:39 PM

直接通过 Navicat 查看 MongoDB 密码是不可能的,因为它以哈希值形式存储。取回丢失密码的方法:1. 重置密码;2. 检查配置文件(可能包含哈希值);3. 检查代码(可能硬编码密码)。

mysql workbench 可以连接到 mariadb 吗 mysql workbench 可以连接到 mariadb 吗 Apr 08, 2025 pm 02:33 PM

MySQL Workbench 可以连接 MariaDB,前提是配置正确。首先选择 "MariaDB" 作为连接器类型。在连接配置中,正确设置 HOST、PORT、USER、PASSWORD 和 DATABASE。测试连接时,检查 MariaDB 服务是否启动,用户名和密码是否正确,端口号是否正确,防火墙是否允许连接,以及数据库是否存在。高级用法中,使用连接池技术优化性能。常见错误包括权限不足、网络连接问题等,调试错误时仔细分析错误信息和使用调试工具。优化网络配置可以提升性能

mysql 需要服务器吗 mysql 需要服务器吗 Apr 08, 2025 pm 02:12 PM

对于生产环境,通常需要一台服务器来运行 MySQL,原因包括性能、可靠性、安全性和可扩展性。服务器通常拥有更强大的硬件、冗余配置和更严格的安全措施。对于小型、低负载应用,可在本地机器运行 MySQL,但需谨慎考虑资源消耗、安全风险和维护成本。如需更高的可靠性和安全性,应将 MySQL 部署到云服务器或其他服务器上。选择合适的服务器配置需要根据应用负载和数据量进行评估。

See all articles