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

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]