思考一个问题,在java工程中有pom.xml进行项目的打包编译部署版本控制,实现项目依赖隔离,在python工程中如何去做?
老方法:通过pip安装,然后手动执行命令生成requirements.txt文件,通过virtualenv进行环境隔离,需要同时依赖两款工具,不能动态更新requirements.txt
升级版:pipenv解决了这个问题,集成pip的依赖包管理和virtualenv环境管理,维护pipfile来控制第三方包的依赖版本,能够自动更新记录文件
缺点:Lock速度缓慢,bug多,强行更新不相关依赖,依赖效果处理差,语法不清晰
你是否还在羡慕那些有开源项目的大佬,却不知道怎么推送自己的项目给其他人使用,还在使用github吗?还在纠结打包配置繁琐吗?他来了,他来了,他带着poetry走来了从此装逼不是大佬们的专属,我们也可以
"Development Status :: 4 - Beta",
"Topic :: Software Development :: Testing",
"Topic :: Software Development :: Quality Assurance",
"Topic :: Software Development :: Libraries :: Python Modules",
"Operating System :: MacOS",
"Operating System :: POSIX :: Linux",
"Operating System :: Microsoft :: Windows",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"License :: OSI Approved :: Apache Software License"
|
1、build
python setup.py build 将同级*.py文件拷贝到build下的同级目录中
2、打包
python setup.py sdist 打成一个tar.gz包
3、安装
a、解压
b、python setup.py install
setup.py帮助信息查看
python setup.py --help-commands
扩展:
1、制作windowns下安装包
python setup.py bdist_wininst # 创建"*.exe"的文件 python setup.py bdist_msi # 创建"*.msi"的文件 python setup.py bdist --format=msi # 同样是创建"*.msi"的文件 2、制作rpm包
python setup.py bdist_rpm # 创建"*.rpm"的文件,该命令需要在Linux操作系统上执行! python setup.py bdist --format=rpm # 同上 3、制作压缩文件
python setup.py bdist --format=zip # 创建"*.zip"压缩文件 python setup.py bdist --format=gztar # 创建"*.tar.gz"文件 4、将python打包成egg包或者whl包(zip)
python setup.py bdist_egg # 打"*.egg"的包 python setup.py bdist_wheel # 打"*.whl"的包
poetry是Python中依赖项管理和打包的工具。它允许您声明项目所依赖的库,它将为您管理(安装/更新)它们。官网地址:Introduction | Documentation | Poetry - Python dependency management and packaging made easy
使用标准的 pyproject.toml 文件,不用写多个配置文件
同时支持管理 Python 程序和 Python 库
更符合直觉的默认设计,比如不会随便更新锁定版本的依赖
干净简洁的命令行输出,没有星星和蛋糕
安装包的时候,使用 upper bound 版本限定,而不是 Pipenv 默认的通配符
卸载包的时候,直接卸载孤立的子依赖,不需要像 Pipenv 那样需要再执行 pipenv clean
poetry可以控制python解释器的版本,依赖第三方包的版本
poetry add flask:安装最新稳定版本的flask
poetry add pytest --dev:指定为开发版本,会写到pyproject.toml中的[tool.poetry.dev-dependencies]区域
poetry add flask==2.22.0:指定具体的版本
poetry install:安装toml中全部的依赖
poetry install --no-dev:只安装非development环境的依赖
poetry update:更新所有锁定版本的依赖包
poetry update flask:更新指定依赖包
poetry remove flask:卸载依赖包
poetry show --outdated:查看可以更新的依赖
poetry show:查看项目安装的依赖
poetry show -t:树形结构查看项目安装的依赖
poetry可以生成虚拟环境,指定不同的python解释器版本,并且自由的切换。创建虚拟环境的两种方式:
1、如果在配置文件中配置了virtualenvs.create=true,执行poetry install时会检查是否有虚拟环境,否则会自动创建。
2、指定创建虚拟环境时使用的python解释器版本
poetry env use python3.8
常用命令
poetry shell:激活虚拟环境
poetry env info:显示虚拟环境列表
poetry env list --full-path:显示虚拟环境绝对路径
poetry env remove xxx:删除虚拟环境
poetry run python -v:查看python版本
安装不讲述了,百度即可,参考Poetry教程一(Poetry安装与卸载)_成都 - 阿木木的博客-CSDN博客_poetry安装
poetry提供了脚手架帮我们创建项目的基本结构
执行poetry new opensourcetest
opensourcetest
|
当项目本身已经是一个python项目,又想使用poetry时候,进入项目的根目录,执行poetry init即可
name :package 名字,必填
version :package 版本号 ,必填
description :package 描述 ,必填
license :package 许可证,可选
authors :package 作者,必填
maintainers :package 维护者,可选
readme :package readme 文件,可选,README.rst或README.md
homepage :package 项目网站的 URL,可选
repository :package 指向项目 repository 的 URL,可选
documentation :package 项目文档的 URL,可选
keywords 与 :package 相关的关键字列表(最多5个),可选
dependencies and dev-dependencies :默认情况下,poetry 会从 Pypi 库中查找依赖项,只需要写名称、版本就行
使用私有存储库
|
extras 支持可选依赖项,装不装都行,当需要安装时,执行
poetry install --extras "pytest jmespath",或者
poetry install -E pytest -E jmespath
|
|
给自己依赖的第三方包做一个版本限制,防止出现,因为第三方包版本更新,导致项目不可用等问题
^约束以左边第一位非0数字为主版本号,主版本号不能变
^约束规范 |
允许的版本范围 |
---|---|
^1.2.3 | >=1.2.3 <2.0.0 |
^1.2 | >=1.2.0 <2.0.0 |
^1 | >=1.0.0 <2.0.0 |
^0.2.3 | >=0.2.3 <0.3.0 |
^0.0.3 | >=0.0.3 <0.0.4 |
^0.0 | >=0.0.0 <0.1.0 |
^0 | >=0.0.0 <1.0.0 |
~约束,以第二个数字为次要版本,以该数字为基准
~约束规范示例 |
允许的版本范围 |
---|---|
~1.2.3 | >=1.2.3 <1.3.0 |
~1.2 | >=1.2.0 <1.3.0 |
~1 | >=1.0.0 <2.0.0 |
*约束,通配符
*约束规范示例 |
允许的版本范围 |
---|---|
* | >=0.0.0 |
1.* | >=1.0.0 <2.0.0 |
1.2.* | >=1.2.0 <1.3.0 |
比较符
|
确定的版本号或范围
|
在依赖中可以指定项目的git依赖,默认拉取master分支,可以指定分支,commit hash,tag等
|
本地路径依赖,如果需要依赖其他位于本地的项目,但是处于不同的路径,可以使用该方式
|
远程url依赖,如果依赖远程仓库的文件,可以使用url的方式,使用poetry add的方式来添加url,
poetry add https://example.com/my-package-0.1.0.tar.gz
|
python版本限制依赖项
1、如果python版本不在约束范围内,就不会安装该依赖包
|
2、根据python版本选择安装第三方包的版本
|
根据系统来进行选择是否安装
|
查看当前配置列表:
poetry config --list
catch-dir:poetry使用的缓存目录的路径
installer.paraller:安装程序时并行执行,默认true
virtualenvs.create:如果虚拟环境不存在,自动创建一个虚拟环境,默认为true
virtualenvs.in-project:在项目根目录创建virtual,默认null,如果设置为true,将在项目根目录中名为 .venv 的文件夹中创建 virtualenv,如果没有设置,poetry 将使用 .venv 目录中的 virtualenv(如果有),如果设置为false,poetry将忽略任何现有的.venv目录
virturalenvs.path:在其中创建虚拟环境的目录
查看某个配置:
poetry config virtualenvs.path
修改某个配置:
poetry config virtualenvs.path /tmp
移除某个配置项:
poetry config virtualenvs.path --unset
关于配置的一些其他说明:
poetry是支持读取系统的环境变量的,不需要通过poetry config去进行修改,所有的设置都支持通过环境变量来进行修改,环境变量必须以POETRY_作为前缀,大写名称组成,用_下划线代替.和-
export POETRY_VIRTUALENVS_PATH=/path/to/virtualenvs/directory