
初学者应使用官方 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 还讨论了专门为程序包开发设置专业的开发环境。它比本指南中描述的环境更加通用。
