pip install new Python 包到所有现有的 virtualenvs

pip install new Python package to all existing virtualenvs

我正在使用 pip 安装一个新的 Python 包。我想用一个命令在我当前所有的虚拟环境中安装这个包。这可能吗?如果可以,我该怎么做?

目前,当我想在虚拟环境中安装新的 Python 软件包 "xyz" 时,我会激活该 venv,然后在命令行中使用标准的 pip install "xyz" .但是,这只会将它安装在当前激活的虚拟环境中。当然,这首先是拥有虚拟环境的重要组成部分。

如果我想在我所有的虚拟环境中安装包 "xyz",我必须为我的每个环境激活-安装-停用。

我想避免这个安全但费力的过程,只需使用一个命令就可以将新软件包 "xyz" 安装到我当前的所有虚拟环境中。

例如: 我列出了我现有的虚拟环境(在我的本地机器上):

λ conda 环境列表

conda 环境:

基地 * C:\ProgramData\Anaconda3 cntk C:\ProgramData\Anaconda3\envs\cntk fastai C:\ProgramData\Anaconda3\envs\fastai

我想在我的所有环境(base、cntk、fastai)中安装的包是 pydicom。

λ 激活碱基

(基础)λ pip install pydicom

(基数)λ ipython Python 3.7.3(默认,2019 年 4 月 24 日,15:29:51)[MSC v.1915 64 位 (AMD64)] 键入 'copyright'、'credits' 或 'license' 以获取更多信息 IPython 7.5.0 -- 增强的交互 Python。类型 '?'寻求帮助。

在[1]中:导入pydicom 在 [2]:

(基数)λ conda deactivate

λ 激活 cntk

(cntk) λ ipython

Python 3.6.8 |蟒蛇公司| (默认,2019 年 2 月 21 日,18:30:04)[MSC v.1916 64 位 (AMD64)] 键入 'copyright'、'credits' 或 'license' 以获取更多信息 IPython 7.4.0 -- 增强的交互 Python。类型 '?'寻求帮助。

在[1]中:导入pydicom


ModuleNotFoundError Traceback(最后一次调用) 在 ----> 1 导入 pydicom

ModuleNotFoundError: 没有名为 'pydicom'

的模块

在 [2] 中:


一切都很好,venv 正在执行它的工作。


λ conda 激活 cntk

(cntk) λ pip 安装 pydicom

正在收集 pydicom 使用缓存 https://files.pythonhosted.org/packages/43/88/d3c419ab2e753e7651510882a53219373e78fb55294cb247dffd3934ea55/pydicom-1.2.2-py2.py3-none-any.whl 安装收集的包:pydicom 成功安装pydicom-1.2.2

(cntk) λ ipython

Python 3.6.8 |蟒蛇公司| (默认,2019 年 2 月 21 日,18:30:04)[MSC v.1916 64 位 (AMD64)] 键入 'copyright'、'credits' 或 'license' 以获取更多信息 IPython 7.4.0 -- 增强的交互 Python。类型 '?'寻求帮助。

在[1]中:导入pydicom

在 [2] 中:


这次显然成功了,因为我在 venv 中安装了 pydicom。


理想情况下,会有这样的命令: $pip 安装 -- ,

$pip 安装 -- 全部

安装到提供的 venv 列表或所有可用的 venvs。


我在考虑变通方法,例如使用 $conda env list 然后解析输出。使用一个简单的脚本按顺序安装到每个列出的 venvs 中。这个思路让我想到了我的子问题:

问:是否可以在不首先激活该 venv 的情况下将 Python 软件包安装到虚拟环境?


我怀疑是否存在简单的单行解决方案(尽管那会很棒),因此欢迎提出解决方法的建议。

如果我的意图自动安装一个新的 Python 包到所有 venvs 不符合最佳实践,也欢迎提出建议。

"Activation" 不是魔法,它只是将 virtualenv 可执行文件位置添加到您的路径并更改您的提示。如果你想在不激活的情况下将某些东西安装到 virtualenv 中,你可以这样做:

/path/to/virtualenv/bin/pip install foo

至于安装到所有虚拟环境,我认为没有任何自动方法可以做到这一点,特别是因为 envs 可以存在于任何地方,所以您也需要一种方法来发现它们。但是如果你愿意,你可以很容易地将上面的命令与环境位置列表结合起来。

我使用 并且它有一个命令 allvirtualenv 所以我可以 运行

allvirtualenv pip install -U pip setuptools

我什至更新了 ~/.tox 中创建的所有虚拟环境。我的整个脚本 run-all-venv

#! /usr/bin/env bash

eval "$@"

if source virtualenvwrapper.sh; then
   allvirtualenv eval "$@"

   for tox_envs in ~/.tox/*; do
      if [[ "$tox_envs" = */.tox/\* ]]; then
         exit 0
      fi
      WORKON_HOME="$tox_envs" allvirtualenv eval "$@"
   done
fi

我运行它是

run-all-venv pip install -U pip setuptools