poetry管理python开发环境学习小记

1. 写在前面

在Python开发中,往往需要根据不同的需求搭建不同的Python环境, 环境管理方面, 之前学习到的方式是anaconda进行统一的管理, 但是工作之后了解到, conda在本地开发时候会提供非常多的便利,但对于生产环境,conda会过于臃肿,且locking的能力需要额外安装工具,所以往往不适用生产环境中的Python环境管理。 生产环境中,可以使用pyenv来管理各种Python版本,而poetry来管理虚拟环境。 这篇文章,主要是记录下这两个工具的使用。

2. Pyenv安装和使用

这个用来管理Python版本的,详细内容学习参考https://github.com/pyenv/pyenv , 安装的话可以使用下面的命令:

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
 
echo 'export PYENV_ROOT=~/.pyenv' >> ~/.bashrc && \
echo 'export PATH=$PYENV_ROOT/bin:$PATH' >> ~/.bashrc && \
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc && \
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

使用pyenv安装Python的时候,会在目标平台编译Python,所以需要安装编译Python相关的依赖,下面命令:

sudo apt-get update

sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

然后激活环境

source ~/.bashrc

常用命令:

# 安装指定版本的Python
pyenv install 3.7.2

# 查看已经安装的Python版本
pyenv versions

# 设置全局的Python版本
pyenv global 3.7.2

# 某个项目中设置使用的Python版本,  进入某个项目
pyenv local 3.8.1

3. Poetry管理Python虚拟环境

Poetry的使用文档https://python-poetry.org/, 我这里只整理常用的命令。

首先,使用上, poetry与conda不一样的一个点,poetry是项目的依赖管理工具, 之前使用conda的时候,可能是新建立虚拟环境,然后安装上要使用的包,然后进行项目开发的时候,指定好这个虚拟环境。而poetry使用的时候, 是先有项目,然后在项目里面,通过pyproject.toml文件来配置该项目所需要的环境,包啥的。 然后通过poetry相关命令创建好虚拟环境。 这个逻辑是不一样的,需要先理解。

3.1 poetry安装

推荐使用在线脚本安装, 但是安装之前,需要先有一个可以执行的Python解释器,比如用上面的pyenv先弄一个全局的Python解释器才行,否则会报错。

$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python

# 这里注意下,如果是ubuntu22版本的话,用上面命令安装不上,需要sudo pip install python3-poetry
# 但是这时候,运行下面命令会报错ModuleNotFoundError: No module named 'cachecontrol'
# 这个解决方法: sudo apt install python3-cachecontrol, 不要pip install

可以通过poetry --version来查看是否安装成功。

3.2 poetry使用

如果是在一个已经有的项目里面使用Poetry, 则只需要运行poetry init命令创建一个pyproject.toml文件,如果是新建一个项目,可以直接

poetry new poetry-demo

此时,当前目录下面就多出一个poetry-demo目录,这个目录下的文件结构:

$ tree poetry-demo
poetry-demo
├── README.rst
├── demo_priject
│   └── __init__.py
├── pyproject.toml
└── tests
    ├── __init__.py
    └── test_demo_priject.py

如果要把项目代码放入到 src 目录下,在创建项目时,可以加上 --src 参数。

我们需要在pyproject.toml文件中写该项目会依赖的各种包,比如,在这里面建立一个test.py文件,写两行代码:

import numpy as np
a = np.array([1, 2, 3])
print(a)

此时,如果直接运行这个文件,会报错找不到numpy,毕竟确实没装,那么,怎么用poetry搭建可运行的虚拟环境呢?

vim pyproject.toml

# 在这里面写入
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = "my poetry learning test"
authors = ["name <[email protected]>"]

[tool.poetry.dependencies]     -- 运行用到的依赖包
python = "^3.8"   -- 这里也可以兼容多版本的写法  python ">=3.7, <=3.10"
numpy = "^1.21.2"
pandas = "^1.3.3"
matplotlib = "^3.5.2"

[tool.poetry.dev-dependencies]    -- 开发用到的依赖包
pytest = "^5.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

保存这个文件。 如果需要再加新的包,可以用poetry管理包的命令

# 安装包   这时候直接可以安装包
poetry add pkg_name     
poetry add pytest --dev   开发包安装

# 删除包
poetry remove pkg_name

# 查看所有依赖包
poetry show

依赖稳定之后, 生成lock文件。

poetry lock

这时候, 项目中的虚拟环境配置完毕, 只需要

poetry install 

就可以安装所有相关依赖,并创建相关虚拟环境。

3.3 poetry虚拟环境管理与查看

建立好虚拟环境之后,在poetry-demo项目下输入

poetry env info

就能看该虚拟环境的名字以及位置。

此时,用

poetry run python test.py   # 此时就能跑起来test.py了

# 如果嫌每次跑test.py都需要poetry run,可以像conda那样,进入到虚拟环境
poetry shell
# 这样,就可以像conda进入虚拟环境一样了

# 此时,也可以像conda那样安装命令 pip install pkg

其他命令:

# 删除虚拟环境
poetry env remove Python版本(这里用Python版本即可)

# 使用某个虚拟环境
poetry env use Python版本(这里用Python版本即可)

# 查看当前是哪个虚拟环境
poetry env list

3.4 常用配置

这里主要是配置镜像源,没有镜像源的时候,安装包有时候会非常慢,所以可以配置PypI镜像源,以阿里源为例,在 pyproject.toml 文件里加入这部分内容:

[[tool.poetry.source]]
name = "aliyun"
url = "https://mirrors.aliyun.com/pypi/simple/"

3.5 pycharm远程连接项目开发

这个和conda管理虚拟环境几乎一样, poetry针对每个项目创建完虚拟环境之后, 这个虚拟环境会保存在~/.cache/pypoetry/virtualenvs/,所以在这里面找到该项目开发使用的python环境的python解释器即可进行远程pycharm开发。

4. 小总

关于pyenv管理python环境,poetry管理python的虚拟环境就先记录到这里,这次依然是从使用的角度整理,关于细节,可以参考上面给出的对应文档, poetry类比着conda,上手其实也挺快。

  • conda, 是创建好虚拟环境之后,安装很多包,之前在学校的时候,常常建立一个万能环境,什么pytorch, tf啥的统一放到一个环境下面,这样做项目的时候,就统统指定这个虚拟环境进行开发,非常的便利。 但这种情景不适用生产环境,一个是万能环境包太多,臃肿,另外,就是可能不同项目要求的包的版本不同,这种情况下万能环境也不适用。实际生产中,这种情况非常常见。
  • 所以生产环境中常常使用poetry,这个是针对每个项目单独弄一个虚拟环境, 通过pyproject.toml去配置运行该项目所需要的各种包,然后进行安装构建, 好处就是只需要安装跑某个具体项目的包,轻量且解决版本要求问题。

这就是这两个的区别啦,至于实际开发, 在远程服务器创建好项目和虚拟环境,都可以在本地使用pycharm进行远程开发,这个对于这两种工具,操作就一样了。

参考

猜你喜欢

转载自blog.csdn.net/wuzhongqiang/article/details/125861099