有没有办法在所有 python 环境中安装一个包

Is there any way to install a package in all python enviroments

我创建了几个python的conda环境。但有时,我会遇到一些实用程序包,它们对我系统上的所有环境都有帮助。有什么办法不用在所有环境之间来回切换并单独安装它们。

谢谢

如果您将所有虚拟环境存储在一个地方,或者如果您已经使用 virtualenvwrapper 将 virtualenv 存储在 ~/.virtualenvs/ 中,您可以使用来自 virtualenvwrapper 的命令 allvirtualenv;如果您不使用 virtualenvwrapper,则必须先安装它。

allvirtualenv pip install somepackages

我使用以下 bash 脚本对 运行 ~/.virtualenvs/~/.tox/ 中的所有环境执行命令:

#! /usr/bin/env bash

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

在这种情况下,您可以在 base (root) 环境中安装软件包。在该默认环境中与命令行实用程序(示例 git)和图形用户界面(示例 spyder)相关的所有包在您的所有 conda 环境中都是可见的。

更新

你可以使用我的script。取消注释最后 3 行并更改包列表。您可以使用 envs 的手动列表或在所有 envs 中使用自动列表。

import subprocess as sub

def conda_env_list():
    p = sub.Popen("conda env list", shell=True, stdout=sub.PIPE, encoding="utf-8")
    p.wait()
    out = p.communicate()[0].splitlines()
    envs = [out[line].split()[0] for line in range(2, len(out)-1)]
    return envs

def conda_env_install(envs, packages, channel="default"):
    TEMPLATE = "conda install {confirm} -c {channel} -n {env} {packages} "
    if isinstance(envs, str):
        envs = [envs]
    if isinstance(packages, list):
        packages = " ".join(packages)
    confirm = "-y"
    for env in envs:
        cmd = TEMPLATE.format(confirm=confirm, packages=packages, \
            channel=channel, env=env)
        p = sub.Popen(cmd, shell=True, stdout=sub.PIPE, encoding="utf-8")
        p.wait()
        print(p.communicate()[0])

envs = conda_env_list()
packages = ["git"]
conda_env_install(envs, packages)