python 中的全局开发依赖项,除了虚拟环境

Global development dependencies in python, aside from virtual environments

问题:必须在每个 python 虚拟环境(包括由 pipenv、poetry 等创建的虚拟环境)中安装通用开发依赖项,这非常烦人。 例如flake8pylintjediblack

最好将它们设置为在每个虚拟环境中全局可用,而不必每次都手动安装。

last time someone asked how to do this,他们收到了一堆评论,责骂他们与他们的工具作对,除了 VSCode 特定的事情外,没有任何实际答案。

然而,我最近 came across a comment 在 Elpy 包(Emacs 的 Python 包)的文档中表明这样的事情在全球范围内确实是可能的:

It is possible to create a single virtual env for the sole purpose of installing flake8 in there, and then simply link the command script to a directory inside your PATH, meaning you do not need to install the program in every virtual env separately.

这听起来是个了不起的想法……而且可以应用于许多其他 devtool 类型的依赖项。不幸的是,编写 Elpy 文档的人并没有详细说明这种事情实际上是如何发生的。

有人可以帮助将引用的段落转化为实现此目标的实际步骤吗?比如,“命令脚本?”那是什么?这个想法只是一个 virtualenv 存在于某个目录中,并且将该目录添加到一个 shell $PATH 将使其中的库以某种方式可用于其他所有 virtualenv 吗?谢谢!

当然——这正是我设置机器的方式,包括 bootstrap 从无到有的步骤:

# in .bashrc
export PATH=$HOME/bin:$PATH
# some script you run once
mkdir -p ~/opt
curl -o virtualenv.pyz https://bootstrap.pypa.io/virtualenv.pyz
python3 virtualenv.pyz ~/opt/venv
rm virtualenv.pyz

~/opt/venv/bin/pip install flake8 pre-commit tox twine
mkdir -p ~/bin
ln -s ~/opt/venv/bin/flake8 ~/bin/
ln -s ~/opt/venv/bin/pre-commit ~/bin/
ln -s ~/opt/venv/bin/tox ~/bin/
ln -s ~/opt/venv/bin/twine ~/bin/
# etc.

我首先下载 virtualenv.pyz 这是一个 zipapp,所以我不需要调用任何全局 pip / 可能打包不当 virtualenv

然后我在~/opt/venv

中设置了一个virtualenv

我在里面安装我的工具

并且我将它们符号链接到 ~/bin 中,我通过 .bashrc

将其放在我的 PATH

我的实际代码位于我的配置管理存储库中:https://github.com/asottile/personal-puppet/blob/753d9491c27b17ae6a2a145fc2aad25d8896e76f/modules/desktop/manifests/venv.pp