Skip to content

搞英语 → 看世界

翻译英文优质信息和名人推特

Menu
  • 首页
  • 作者列表
  • 独立博客
  • 专业媒体
  • 名人推特
  • 邮件列表
  • 关于本站
Menu

我的 Goldilocks Python 设置:pyenv、pipx 和 pip-tools

Posted on 2023-01-29

我的 Goldilocks Python 设置:pyenv、pipx 和 pip-tools

初学者应使用官方 python.org 安装程序安装 Python。但是对于从事多个项目的专业开发人员或任何支持多个 Python 版本的项目来说,安装程序工作流程并不是很有效。

在本指南中,我将向您展示如何:

  • 使用pyenv安装多个版本的 Python。
  • 使用pipx安装全局实用程序,如black和flake8 。
  • 使用pip-tools管理项目依赖关系。

使用pyenv安装 Python

pyenv允许您安装多个版本的 Python 并根据需要在它们之间切换。要安装pyenv ,请运行以下与您的操作系统相对应的命令。

☝️
注意: pyenv不是管理 Python 版本的唯一选项。一些开发人员更喜欢asdf或homebrew等工具。其他人使用他们操作系统的本机包管理器。

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 版本号的名为.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安装的一些工具是:

  • black :我喜欢的 Python 自动格式化程序。
  • flake8 :我首选的 Python 代码 linter。
  • ipython :我首选的 Python REPL。

以下命令在三个不同的环境中安装所有三个工具:

 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设置的输入框中:

我的 Goldilocks Python 设置:pyenv、pipx 和 pip-tools

☝️
注意:您也可以通过编辑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 --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是恰到好处的粥。

?
致谢:我目前的 Python 工具哲学大部分是受 Sebastian Witowski 的Modern Python Devloper’s Toolkit的启发。我鼓励所有使用 Python 的人都检查一下。

要考虑的其他pipx应用程序

根据您进行的开发类型,以下软件包可能是有用的工具,可以作为带有pipx的应用程序安装:

  • 用于脚手架项目的cookiecutter 。
  • 用于管理pre-commit提交挂钩的预提交。
  • tox用于测试和任务自动化。
  • build用于构建 Python 包的前端。

深入挖掘

如果您编写和分发 Python 包,那么您需要阅读 Dan Hillard 的书Publishing Python Packages。

除了介绍如何设置、发布、维护和扩展您的程序包之外,Dane 还讨论了专门为程序包开发设置专业的开发环境。它比本指南中描述的环境更加通用。

从Manning获得即时访问,或从Amazon购买印刷版。

我的 Goldilocks Python 设置:pyenv、pipx 和 pip-tools


原文: https://davidamos.dev/my-goldilocks-python-set-up/

本站文章系自动翻译,站长会周期检查,如果有不当内容,请点此留言,非常感谢。
  • Abhinav
  • Abigail Pain
  • Adam Fortuna
  • Alberto Gallego
  • Alex Wlchan
  • Answer.AI
  • Arne Bahlo
  • Ben Carlson
  • Ben Kuhn
  • Bert Hubert
  • Bits about Money
  • Brian Krebs
  • ByteByteGo
  • Chip Huyen
  • Chips and Cheese
  • Christopher Butler
  • Colin Percival
  • Cool Infographics
  • Dan Sinker
  • David Walsh
  • Dmitry Dolzhenko
  • Dustin Curtis
  • Elad Gil
  • Ellie Huxtable
  • Ethan Marcotte
  • Exponential View
  • FAIL Blog
  • Founder Weekly
  • Geoffrey Huntley
  • Geoffrey Litt
  • Greg Mankiw
  • Henrique Dias
  • Hypercritical
  • IEEE Spectrum
  • Investment Talk
  • Jaz
  • Jeff Geerling
  • Jonas Hietala
  • Josh Comeau
  • Lenny Rachitsky
  • Liz Danzico
  • Lou Plummer
  • Luke Wroblewski
  • Matt Baer
  • Matt Stoller
  • Matthias Endler
  • Mert Bulan
  • Mostly metrics
  • News Letter
  • NextDraft
  • Non_Interactive
  • Not Boring
  • One Useful Thing
  • Phil Eaton
  • Product Market Fit
  • Readwise
  • ReedyBear
  • Robert Heaton
  • Ruben Schade
  • Sage Economics
  • Sam Altman
  • Sam Rose
  • selfh.st
  • Shtetl-Optimized
  • Simon schreibt
  • Slashdot
  • Small Good Things
  • Taylor Troesh
  • Telegram Blog
  • The Macro Compass
  • The Pomp Letter
  • thesephist
  • Thinking Deep & Wide
  • Tim Kellogg
  • Understanding AI
  • 英文媒体
  • 英文推特
  • 英文独立博客
©2025 搞英语 → 看世界 | Design: Newspaperly WordPress Theme