python打包:setuptools的使用

2023-12-21 20:38

本文主要是介绍python打包:setuptools的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

资料来源:https://blog.csdn.net/chenfeidi1/article/details/80873979
https://www.jianshu.com/p/ea9973091fdf

介绍

曾经 Python 的分发工具是 distutils,但它无法定义包之间的依赖关系。setuptools 则是它的增强版,能帮助我们更好的创建和分发 Python 包,尤其是具有复杂依赖关系的包。其通过添加一个基本的依赖系统以及许多相关功能,弥补了该缺陷。他还提供了自动包查询程序,用来自动获取包之间的依赖关系,并完成这些包的安装,大大降低了安装各种包的难度,使之更加方便。

一般 Python 安装会自带 setuptools,如果没有可以使用 pip 安装:

$ pip install setuptools

简单打包

以下资料来自:https://www.cnblogs.com/smileyes/p/7657591.html

创建文件

  • 创建文件结构如下:
setuptools_demo/
├── pkDemo
│   └── __init__.py
└── setup.py
  • setup.py内容如下:
from setuptools import find_packages,setup
setup(name = 'pkDemo',version = '0.1',packages = find_packages(),
)
  • init.py的内容如下:
def demo():print "This is a demo package!"if __name__ == '__main__':demo()

执行打包命令

cd setuptools_demo
python setup.py bdist_egg
  • 出现如下界面说明打包成功了
    在这里插入图片描述
  • 再次查看文件结构如下:
    在这里插入图片描述

执行命令安装包

  • 在当前路径下执行包安装命令:
python setup.py install

如果报错:

error: [Errno 13] Permission denied: '/usr/local/lib/

处理方法:

在ubuntu系统下使用pip 命令安装包时,出现以下类似错误提示:

error: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/    

那么,要用root权限,可以用sudo表示用root权限执行,在命令前面加sudo命令

这种错误是因为权限问题,可用sudo命令即root权限执行即可。

出现如下界面说明安装成功了
在这里插入图片描述

导入包并使用

  • 在python文件导入使用
import pkDemo
pkDemo.demo() 
"""
输出:This is a demo package!
"""

卸载安装的包

  • 删除指定的模块或者包, 用如下命令:
pip uninstall xxx  如:pip uninstall pycurl

不同的打包方式

以下资料来源:https://blog.csdn.net/chenfeidi1/article/details/80873979

在目录 learn_setup 下新建安装文件 setup.py,然后创建包 myapp 模拟要打包源码包:

.
├── myapp
│ └── __init__.py
└── setup.py

一个最简单的 setup.py 文件内容如下:

from setuptools import setupsetup(name='firstApp', # 应用名version='0.0.1', # 版本号packages=['myapp'], # 包括在安装包内的 Python 包
)

Source distribution

  • 使用 sdist 可以打包成 source distribution,支持的压缩格式有:
FormatDescriptionNotes
zipzip file (.zip)Windows 默认
gztargzip’ed tar file (.tar.gz)Unix 默认
bztarbzip2’ed tar file (.tar.bz2)
xztarxz’ed tar file (.tar.xz)
ztarcompressed tar file (.tar.Z)
tartar file (.tar)

使用方式为:

$ python setup.py sdist --formats=gztar,zip

现在目录下多出 dist 和 *.egg-info 目录,dist 内保存了我们打好的包,上面命令使用 --formats 指定了打出 .tar.gz 和 .zip 包,如果不指定则如上表根据具体平台默认格式打包。

包的名称为 setup.py 中定义的 name, version以及指定的包格式,格式如:firstApp-0.0.1.tar.gz。

Built distribution

  • 使用 bdist 可以打出 built distribution,和源码包相比,由于预先构建好,所以安装更快:
FormatDescriptionNotes
gztargzipped tar file (.tar.gz)Unix 默认
bztarbzipped tar file (.tar.bz2)
xztarxzipped tar file (.tar.xz)
ztarcompressed tar file (.tar.Z)
tartar file (.tar)
zipzip file (.zip)Windows 默认
rpmRPM
pkgtoolSolaris pkgtool
sduxHP-UX swinstall
wininstself-extracting ZIP file for Windows
msiMicrosoft Installer.

使用上,和 sdist 一样,可以使用 --formats 指定包格式。如:

python setup.py bdist --formats=rpm	

同时为了简化操作,setuptools 提供了如下命令:

CommandFormatsNotes
bdist_dumbtar, gztar, bztar, xztar, ztar, zipWindows 默认 zip, Unix 默认 gztar
bdist_rpmrpm, srpm
bdist_wininstwininst
bdist_msimsi

所以上面打 rpm 包可以使用:

$ python setup.py bdist_rpm

如果使用 bdist_wininst,打出来的是 exe 安装文件,可以点击安装。

Wheel

  • Wheel 也是一种 built 包,而且是官方推荐的打包方式。也许你曾经遇见或使用过 egg 包,但现在 wheel 是官方推荐的打包方式

wheel包的优点:

  • 更快地安装纯Python和本机C扩展包。
  • 避免安装时任意执行代码。(避免setup . py)
  • 在Windows或macOS上安装C扩展不需要编译器。
  • 为测试和持续集成提供更好的缓存。
  • 创建.pyc文件作为安装的一部分,以确保它们与使用的Python解释器匹配。
  • 跨平台和机器的更一致的安装。

使用 wheel 打包,首先要安装 wheel:

pip install wheel

然后使用 bdist_wheel 打包:

python setup.py bdist_wheel

执行成功后,目录下除了 dist 和 *.egg-info 目录外,还有一个 build 目录用于存储打包中间数据。

wheel 包的名称如 firstApp-0.0.1-py3-none-any.whl,其中 py3 指明只支持 Python3。

可以使用参数 --universal,包名如 mfirstApp-0.0.1-py2.py3-none-any.whl,表明 wheel 包同时支持 Python2 和 Python3

使用 universal 也成为通用 wheel 包,反之称为纯 wheel 包。

实际使用

添加greet.py文件

# greet.pydef hello():print('Hello, welcome to setuptools!')

使用 bdist_wheel 再次打包后,我们可以使用 pip 安装到本地 Python 的 site-packages 目录。

pip install dist/fisrtApp-0.0.1-py3-none-any.whl

现在和其他使用 pip 安装的三方库一样使用:

from myapp.greet import hellohello()

应用开发过程中会频繁变更,每次安装都需要先卸载旧版本很麻烦。使用 develop 开发模式安装的话,实际代码不会拷贝到 site-packages 下,而是除一个指向当前应用的链接(*.egg-link)。
这样当前位置的源码改动就会马上反映到 site-packages。使用如下:

pip install -e .  # 或者 python setup.py develop

如需卸载,使用 pip uninstall。

setup() 参数

name

  • 项目名,也是最终在 PyPI 上搜索的名称。

version

  • 项目版本号
version='0.0.1'

packages

  • 列出项目内需要被打包的所有 package。一般使用 setuptools.find_packages() 自动发现。
packages=find_packages(exclude=['contrib', 'docs', 'tests*'])
  • exclude 用于排除不打包的 package。

package_data

项目依赖数据文件,数据文件必须放在项目目录内且使用相对路径。

package_data={'myapp': ['data/*.yml'],
}

如果不指定作为目录的键为空串,则代表对所有模块操作(下例中将包含所有包内 data 目录下的 yaml 文件):

package_data={'': ['data/*.yml'],
}

对于简单工程来说,手动增加packages参数很容易,刚刚我们用到了这个函数,它默认在和setup.py同一目录下搜索各个含有init.py的包。其实我们可以将包统一放在一个src目录中,另外,这个包内可能还有aaa.txt文件和data数据文件夹。

demo
├── setup.py
└── src└── demo├── __init__.py├── aaa.txt└── data├── abc.dat└── abcd.dat            

如果不加控制,则setuptools只会将init.py加入到egg中,想要将这些文件都添加,需要修改setup.py

from setuptools import setup, find_packages
setup(packages = find_packages('src'),  # 包含所有src中的包package_dir = {'':'src'},   # 告诉distutils包都在src下package_data = {# 任何包中含有.txt文件,都包含它'': ['*.txt'],# 包含demo包data文件夹中的 *.dat文件'demo': ['data/*.dat'],}
)

这样,在生成的egg中就包含了所需文件了。看看:


Archive:  dist/demo-0.0.1-py2.7.eggLength     Date   Time    Name--------    ----   ----    ----88  06-07-13 23:40   demo/__init__.py347  06-07-13 23:52   demo/__init__.pyc0  06-07-13 23:45   demo/aaa.txt0  06-07-13 23:46   demo/data/abc.dat0  06-07-13 23:46   demo/data/abcd.dat1  06-07-13 23:52   EGG-INFO/dependency_links.txt178  06-07-13 23:52   EGG-INFO/PKG-INFO157  06-07-13 23:52   EGG-INFO/SOURCES.txt5  06-07-13 23:52   EGG-INFO/top_level.txt1  06-07-13 23:52   EGG-INFO/zip-safe--------                   -------777                   10 files

description

  • 项目的简短描述,一般一句话就好,会显示在 PyPI 上名字下端。
description='My first Python project'

对项目的完整描述,使用 long_description。如果此字符串是 rst 格式的,PyPI 会自动渲染成 HTML 显示。也可指定使用 markdown。

long_description=long_description,
long_description_content_type='text/x-rst'

url

  • 通常为 GitHub上 的链接或者 readthedocs 的链接。。
url='https://github.com/pypa/sampleproject'

author

  • 作者信息。
author='example',
author_email='example@example.com'

license

  • 项目许可证。
license='MIT'

keywords

项目关键词列表。

keywords='sample setuptools development'

project_urls

项目相关额外连接,如代码仓库,文档地址等。

project_urls={'Documentation': 'https://packaging.python.org/tutorials/distributing-packages/','Funding': 'https://donate.pypi.org','Say Thanks!': 'http://saythanks.io/to/example','Source': 'https://github.com/pypa/sampleproject/','Tracker': 'https://github.com/pypa/sampleproject/issues',
}

install_requires

项目依赖的 Python 库,使用 pip 安装本项目时会自动检查和安装依赖。

install_requires=['pyyaml']

python_requires

指定项目依赖的 Python 版本。

python_requires='>=3'

上传 Wheel 到 PyPI

  • Wheel 包可以自己使用和传输给其他人使用,但是维护更新不方便,而 PyPI 作为 Python 的 软件仓库,让所有人可以方便的上传和下载,以及管理三方库。

注册 PyPI 账号

登录 https://pypi.python.org/pypi,进入 Register 注册账号。

安装 twine

虽然 setuptools 支持使用 setup.py upload 上传包文件到 PyPI,但只支持 HTTP 而被新的 twine 取代。

同样的,需要先安装 twine:

pip install twine

使用 twine 上传

使用 upload:

twine upload dist/*

输入 username 和 password 即上传至 PyPI。如果不想每次输入账号密码,可以在家目录下创建 .pypirc 文件,内容如下:

[distutils]
index-servers =pypipypitest[pypi]
username: 
password: [pypitest]
repository: https://test.pypi.org/legacy/
username: 
password: 

填上自己的账号密码即可,这里配置了官方的 pypi 和 pypitest,若要配置其他仓库,按格式添加。

回到 PyPI 主页即可看到上传的 firstApp。
在这里插入图片描述
在这里插入图片描述
PyPI 主页显示会有延迟,所以不能马上搜索到结果,pip search 也可能搜索不到,但已经可以使用 pip 安装。

以上就是 Python 打包和分发的全部内容,当然是最简单的功能。

PyPI 上传推荐配置

setup.py 
-name
-version
-author
-author_email
-url
-packages
-description
-package_data/data_files
setup.cfg
MANIFEST.in
README.rst
LICENSE.txt
<项目>

一个完整的 setup.py 示例

from setuptools import setup, find_packageswith open('README.rst', 'r', encoding='utf-8') as rd:long_description = rd.read()setup(name="HelloWorld",version="0.1",packages=find_packages(),scripts=['say_hello.py'],# Project uses reStructuredText, so ensure that the docutils get# installed or upgraded on the target machineinstall_requires=['docutils>=0.3'],package_data={# If any package contains *.txt or *.rst files, include them:'': ['*.txt', '*.rst'],# And include any *.msg files found in the 'hello' package, too:'hello': ['*.msg'],},# metadata for upload to PyPIauthor="Me",author_email="me@example.com",description="This is an Example Package",long_description = long_description,license="PSF",keywords="hello world example examples",url="http://example.com/HelloWorld/", # project home page, if anyproject_urls={"Bug Tracker": "https://bugs.example.com/HelloWorld/","Documentation": "https://docs.example.com/HelloWorld/","Source Code": "https://code.example.com/HelloWorld/",}# could also include long_description, download_url, classifiers, etc.
)

这篇关于python打包:setuptools的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/521426

相关文章

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学