问题 virtualenv可以继承另一个吗?


我想创建一个 virtualenv 用另一个作为起点,这可能吗?

我必须记住案例:

  1. 假设我有两个 virtualenv 一个用于生产,一个用于开发。开发环境需要与生产环境相同的软件包,但它需要生产环境中我不想要的其他软件包。我不想两次安装普通包。

  2. 我想尝试一个软件包的开发版本 matplotlib 例如。该软件包的开发版本与稳定版本具有相同的要求。所以我创建了一个 virtualenv 叫 matplotib_stable 并安装要求和稳定版本。然后我创建了第二个 virtualenv 叫 matplotlib_dev 并使用 matplotlib_stable 作为起点(对于 matplotlib 要求)但我安装了开发版本。

如何使用pip从本地缓存安装? 似乎解决了下载软件包的问题,​​但我认为它不涉及修改 sys.path


4408
2018-05-10 16:45


起源



答案:


一种解决方案是使用 virtualenvwrapperadd2virtualenv 命令。这个

将指定的目录添加到Python的路径中   目前活跃的virtualenv。

所以,如果我有两个 virtualenvENV1 和 ENV2, 而且我要 ENV2 访问包中 ENV1,然后我需要:

  1. 启用 ENV2

    workon ENV2

  2. ENV1使用的site-packages目录 add2virtualenv

    add2virtualenv $WORKON_HOME/ENV1/lib/python2.6/site-packages

以上假设 $WORKON_HOME 是你的virtualenv目录的位置,并且你正在使用python2.6,所以显然相应地调整它们。

虽然这提供了对包的访问,但它不会调整shell路径。换句话说,脚本安装到 bin 使用此方法无法访问目录。


12
2018-05-10 17:30



当我在两个virtualenvs上安装了不同版本的相同软件包时,我发现外部环境(ENV1)优先于内部环境(ENV2)。看起来像add2virtualenv将其路径更早地放在sys.path导入列表中。一个简单的解决方案是使用以下命令: add2virtualenv $WORKON_HOME/ENV2/lib/python2.6/site-packages 然后它就像一个魅力。 - Yonatan
@Yann谢谢Yann!我在ENV1中安装了pylint,然后 add2virtualenv $WORKON_HOME/ENV1/lib/python3.4/site-packages,但是pylint不工作! - HelloNewWorld
@HelloNewWorld我没用过 virtualenv 和 vertualenvwrapper 有一段时间,为什么不发布关于这个问题的新问题? - Yann
@Yann同意。可能是获得Python 3和更新答案的时候了 venv。 - P1h3r1e3d13


答案:


一种解决方案是使用 virtualenvwrapperadd2virtualenv 命令。这个

将指定的目录添加到Python的路径中   目前活跃的virtualenv。

所以,如果我有两个 virtualenvENV1 和 ENV2, 而且我要 ENV2 访问包中 ENV1,然后我需要:

  1. 启用 ENV2

    workon ENV2

  2. ENV1使用的site-packages目录 add2virtualenv

    add2virtualenv $WORKON_HOME/ENV1/lib/python2.6/site-packages

以上假设 $WORKON_HOME 是你的virtualenv目录的位置,并且你正在使用python2.6,所以显然相应地调整它们。

虽然这提供了对包的访问,但它不会调整shell路径。换句话说,脚本安装到 bin 使用此方法无法访问目录。


12
2018-05-10 17:30



当我在两个virtualenvs上安装了不同版本的相同软件包时,我发现外部环境(ENV1)优先于内部环境(ENV2)。看起来像add2virtualenv将其路径更早地放在sys.path导入列表中。一个简单的解决方案是使用以下命令: add2virtualenv $WORKON_HOME/ENV2/lib/python2.6/site-packages 然后它就像一个魅力。 - Yonatan
@Yann谢谢Yann!我在ENV1中安装了pylint,然后 add2virtualenv $WORKON_HOME/ENV1/lib/python3.4/site-packages,但是pylint不工作! - HelloNewWorld
@HelloNewWorld我没用过 virtualenv 和 vertualenvwrapper 有一段时间,为什么不发布关于这个问题的新问题? - Yann
@Yann同意。可能是获得Python 3和更新答案的时候了 venv。 - P1h3r1e3d13


以下似乎对我有用。假设您要从被调用的旧虚拟环境继承 old。由于您可以指定在创建新环境时使用哪个python版本,只需执行以下操作:

virtualenv -p path_to_venvs/old/bin/python --system-site-packages new_env

-1
2018-03-22 15:55



不幸的是,你不能以这种方式继承virtualenvs。请注意命令输出中的消息: 使用基本前缀'/ usr' - allprog
嗯,你是对的,我得到这个消息。但是,出于所有实际目的,它仍然适用于我 - 我可以在使用新的virtualenv时从旧的virtualenv导入包。我会调查这个! - Lisa
你确定你使用旧的环境?安装系统安装中没有的东西并尝试导入。 - allprog