【问题标题】:Activating the virtualenv of two different version of Python激活两个不同版本 Python 的 virtualenv
【发布时间】:2017-08-22 05:46:54
【问题描述】:

我们的系统包含两个不同的 Python 版本(2.7 和 3.5)。 我们需要在 Python3.5 virtualenv 上安装一些依赖项,但 Python2.7 virtualenv 已经为登录的用户激活,我们无法停用 virtualenv

我们想知道,是否可以为同一用户同时激活两个不同 Python 版本的 virtualenv

我们尝试使用以下命令为 Python2.7 创建一个 virtualenv:

virtualenv -p /usr/bin/python2.7 env2.7
source env2.7/bin/activate 

激活后,我们使用以下命令为 Python3 创建了一个 virtualenv:

virtualenv -p /usr/bin/python3 env3
source env3/bin/activate 

上面的命令激活了env3,我们想知道,它是否会影响我们在Python2.7 virtualenv中运行的应用程序。

【问题讨论】:

  • 如果您需要一个用于运行特定应用程序而不是开发,您最好使用pipsi 在隔离的虚拟环境中安装程序。
  • pipsi是很好的工具,但是我们不能使用其他工具,而pipsi使用python2.7,但我想使用`python3'。虽然有办法解决这个问题。

标签: python-2.7 python-3.x virtualenv


【解决方案1】:

由于 Python 2 和 Python 3 虚拟环境使用相同的 shell 变量来描述环境,因此您想做的事情似乎很困难。但是,如果您只是希望能够在一个虚拟环境中运行程序,而另一个虚拟环境处于活动状态,则可以通过以下方式实现。这假设您主要想要一个 Python 2 虚拟环境,其中混入了一些 Python 3 程序。

  1. 创建并填充 Python 2 virtualenv。

  2. 创建 Python 3 virtualenv,为您希望在 Python 2 虚拟环境中使用的 Python 程序定义控制台入口点。通过构建虚拟环境来安装入口点。

  3. 复制从 Python 3 环境的 /bin 子目录中的入口点“二进制文件”到 /bin 子目录中Python 2 虚拟环境。

如果您查看入口点文件,您会发现它们已获得shebang line,将它们指向 Python 3 virtualenv 的 Python 解释器,这足以确保它在正确的环境上下文中运行.

【讨论】:

  • python 程序中的控制台入口点是指python-packaging.readthedocs.io/en/latest/…
  • 正是如此,是的。这是构建命令行处理器的简单方法。好的部分是,它为您提供了一个人工制品,您可以将其复制到另一个虚拟环境中,而不会丢失与它内置的 virtualenv 的连接。
【解决方案2】:

即使是单个用户,您仍然可以运行多个 shell 副本,每个副本都有自己的一组环境变量用于每个程序。

因此,很容易同时运行两个虚拟环境。只需将您的命令包装在 () 中即可。

试试这个:

virtualenv -p /usr/bin/python3.5 p35-venv
virtualenv -p /usr/bin/python2.7 p27-venv

echo '
(source p27-venv/bin/activate; python --version; sleep 5) &
(source p35-venv/bin/activate; python --version; sleep 5) &
' > test.sh
chmod a+x test.sh

./test.sh

这将启动新的 bash 进程(命令周围的括号将在新的 bash 中运行命令),然后激活其中的第一个 venv,输出活动的 Python 版本并休眠 5 秒。这将全部在后台运行,test.sh 脚本将在第一个括号完成之前继续执行第二个命令。第二个括号将启动第二个 bash 进程,激活其中的第二个 venv,输出 Python 版本并休眠 5 秒。两个新的 bash 进程都在后台并行运行,因此您会在它们完成 sleep 命令之前看到它们的输出。

【讨论】:

  • 但是python2.7 virtualenv已经在系统中激活了。在执行命令source p35-venv/bin/activate; python hello35.py时,是否会退出python2.7 virtualenv并激活python3.5 virtualenv?
  • @Bidyut 每个 virtualenv 仅在括号内有效。此外,第二个命令在第一个命令完成之前启动,它们仍然成功。编辑:只需在每个文件中添加“导入时间;time.sleep(5)”即可查看它们是否真正并行运行。
最近更新 更多