初学者应使用官方 python.org 安装程序安装 Python。但是对于从事多个项目的专业开发人员或任何支持多个 Python 版本的项目来说,安装程序工作流程并不是很有效。
在本指南中,我将向您展示如何:
- 使用
pyenv
安装多个版本的 Python。 - 使用
pipx
安装全局实用程序,如black
和flake8
。 - 使用
pip-tools
管理项目依赖关系。
使用pyenv
安装 Python
pyenv
允许您安装多个版本的 Python 并根据需要在它们之间切换。要安装pyenv
,请运行以下与您的操作系统相对应的命令。
macOS/Linux
使用下面的自动安装程序,或查看自述文件以获取更多选项:
curl https://pyenv.run | bash
完成后,您需要重新启动 shell:
exec "$SHELL"
视窗
使用下面的 PowerShell 安装,或查看自述文件以获取更多选项:
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
pyenv
仅与 Unix/Linux 操作系统兼容。 Windows 用户必须使用单独维护pyenv-win
分支。 pyenv
和pyenv-win
共享相同的 CLI 命令,因此本指南适用于所有操作系统。安装pyenv
或pyenv-win
后,运行pyenv install 3.11
安装最新版本的 Python 3.11:
pyenv install 3.11
在撰写本文时,最新版本是 3.11.1。
使用不同的版本前缀或特定的版本号来安装其他版本的 Python。例如,以下命令安装最新版本的 Python 3.10:
pyenv install 3.10
要使用已安装的特定 Python 版本,请运行python global
:
pyenv global 3.11.1
现在您的python3
命令指向 Python 3.11.1。
.python-version
的文本文件放在项目的根目录中。每当您cd
进入项目的文件夹时, pyenv
都会自动将您的解释器切换到.python-version
中指定的版本。使用pipx
安装全局实用程序
pipx
是一个 Python 包安装程序,可在隔离环境中安装应用程序和命令行实用程序,并使它们在全球范围内可用。
这对于像black
和flake8
这样的工具特别有用,因为它们可以安装一次并跨多个项目使用,同时仍然考虑项目特定的配置文件。
您可以使用pip
安装pipx
:
python3 -m pip install pipx
在使用pipx
之前,您需要将其添加到PATH
中:
python3 -m pipx ensurepath
pipx
将它安装的应用程序链接到最初用于安装pipx
的同一 Python 可执行文件。
因此,当您调用使用pipx
安装的应用程序时,这些应用程序将使用pipx
Python 可执行文件运行。 ( ipython
除外,它将检测和使用项目特定的虚拟环境。)
这通常不是问题,甚至可能是有益的,因为它将工具与项目依赖项隔离开来。但请注意:卸载pipx
Python 可执行文件会使任何指向它的pipx
安装工具无法使用。
pipx
沮丧的是,您必须为使用 pyenv 安装的每个 Python 版本安装pyenv
。
我用pipx
安装的一些工具是:
以下命令在三个不同的环境中安装所有三个工具:
pipx install black pipx install flake8 pipx install ipython
现在,您可以像往常一样在所有项目中使用这些工具,而无需在每个项目的环境中安装它们。
VS 代码用户注意事项
如果您将Python 用于 VS Code ,则需要将flake8
路径指向正确的位置。如果不这样做,每次打开 VS Code 时都会看到一个弹出窗口,提示“未安装flake8
”。
运行pipx list
以列出pipx
安装的每个应用程序。应用程序安装路径显示在输出的第二行:
$ pipx list venvs are in /Users/damos/.local/pipx/venvs apps are exposed on your $PATH at /Users/damos/.local/bin package black 22.12.0, installed using Python 3.11.1 - black - blackd package flake8 6.0.0, installed using Python 3.11.1 - flake8 package ipython 8.9.0, installed using Python 3.11.1 - ipython - ipython3
就我而言,应用程序安装在/Users/damos/.local/bin
中。现在运行which flake8
以查看flake8
命令指向哪个可执行文件:
$ which flake8 /Users/damos/.local/bin/flake8
将此路径复制到剪贴板。
which flake8
的输出应在pipx
用于安装应用程序的同一目录中显示flake8
。
如果没有,您可能之前安装了flake8
,其 Python 版本不受pyenv
管理。在这种情况下,您需要卸载旧版本的flake8
或删除旧版本的 Python。
通过转到“文件”>“设置”菜单或在 macOS 上按 Cmd+ 或在 Linux/Windows 上按 Ctrl+,打开 VS Code 设置资源管理器。
在搜索栏中输入flake8 ,然后按 Enter。然后将flake8
的路径粘贴到Python > Linting: Flake8 Path设置的输入框中:
python.linting.flake8Path
设置在settings.json
中进行设置。使用pip-tools
管理项目依赖
我只需要使用pip-tools
大约 5 分钟就知道我一直需要它。 pip-tools
可以在您需要它的地方帮助您,并在其他任何地方都不碍事。基本用法是这样的。
在新文件夹中启动一个新的 Python 项目:
# Create a new folder and change directories to it mkdir ~/my-project && cd ~/my-project # Create a new virtual environment python3 -m venv .venv --prompt my-project # Activate the virtual environment source .venv/bin/activate # Update pip python -m pip install -U pip
然后使用pip
将pip-tools
安装到项目的虚拟环境中:
python -m pip install pip-tools
pipx
安装和使用pip-tools
,但目前还没有得到很好的支持。文档官方推荐在项目环境中安装pip-tools
,我可以确认这是更可靠的方法。您项目的依赖项位于一个名为requirements.in
的文件中。例如,Django 3 项目的requirements.in
文件可能如下所示:
# ~/my-project/requirements.in django<4.0
您可以使用pip-compile
命令生成具有完全解析的依赖项的requirements.txt
:
pip-compile --allow-unsafe --resolver=backtracking requirements.in
--allow-unsafe
和--resolver=backtracking
选项都将成为pip-tools
下一个主要版本的默认选项。文档建议传递这些选项以采用新的默认行为。 pip-compile
生成的requirements.txt
文件看起来像这样:
# # This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # pip-compile --allow-unsafe --resolver=backtracking requirements.in # asgiref==3.6.0 # via django django==3.2.16 # via -r requirements.in pytz==2022.7.1 # via django sqlparse==0.4.3 # via django
请注意,文件顶部有一条注释,表明它是由pip-compile
自动生成的(它甚至包括命令!)并且每个版本号都是固定的。
我通常为开发依赖项创建另一个名为dev-requirements.in
的文件,例如pytest
和django-debug-toolbar
,甚至pip-tools
本身:
# ~/my-project/dev-requirements.in # Use requrements.txt as a constraint file -c requirements.txt django-debug-toolbar pip-tools pytest
使用requirements.txt
作为约束文件可确保为dev-requirements.in
中的包安装的任何依赖项都与requirements.txt
中指定的包版本兼容。
再次运行pip-compile
生成dev-requirements.txt
文件:
pip-compile --allow-unsafe --resolver=backtracking dev-requirements.in
现在是真正的魔法。运行pip-sync
将您的虚拟环境与requirements.txt
和dev-requirements.txt
文件中的包同步:
pip-sync requirements.txt dev-requirements.txt
要更新或添加包,请编辑适当的.in
文件,然后重新编译并重新同步所有内容。
*-requirements.in
和*-requirements.txt
文件检查到版本控制中。我经常将所有这些包装到一个Makefile
中:
install: @pip install -r requirements.txt -r dev-requirements.txt compile: @pip-compile --allow-unsafe --resolver=backtracking requirements.in @pip-compile --allow-unsafe --resolver=backtracking dev-requirements.in sync: @pip-sync requirements.txt dev-requirements.txt
协作者可以在克隆存储库以设置他们的环境后运行make install
,然后根据需要运行make compile && make sync
以保持一切同步。
Python 依赖管理工具比比皆是。
我知道很多 Python 开发人员都信奉poetry
或pipenv
。而且我知道很多仍然使用好的 ol’ pip freeze
。就我个人而言, pipenv
和poetry
对我来说太笨重了。 pip freeze
对我来说很乏味。而新的pdm
项目看起来很有趣,但还有很长的路要走。
叫我 Goldilocks,但pip-tools
是恰到好处的粥。
要考虑的其他pipx
应用程序
根据您进行的开发类型,以下软件包可能是有用的工具,可以作为带有pipx
的应用程序安装:
- 用于脚手架项目的
cookiecutter
。 - 用于管理
pre-commit
提交挂钩的预提交。 -
tox
用于测试和任务自动化。 -
build
用于构建 Python 包的前端。
深入挖掘
如果您编写和分发 Python 包,那么您需要阅读 Dan Hillard 的书Publishing Python Packages。
除了介绍如何设置、发布、维护和扩展您的程序包之外,Dane 还讨论了专门为程序包开发设置专业的开发环境。它比本指南中描述的环境更加通用。