从系统 运行 不同的 python 版本激活 virtualenv

Activate virtualenv from a system running a different python version

我有两台计算机(运行 Ubuntu)可以访问一台服务器。两台电脑的共享主目录在服务器上

在计算机 (A) 上安装了 python 3.5,在计算机 (B) 上安装了 python 3.7。我在共享主目录(使用 python 3.7)上从计算机 (B) 创建了一个 virtualenv。

现在虽然可以从计算机 (A) 激活该 virtualenv,但它不使用 "virtualenv-python 3.7",而是系统的 python 3.5。所以从技术上讲,virtualenv 已激活,但实际上并未激活。

请注意 VIRTUAL_ENV 路径设置正确。

我以为 virtualenv-folder 是一个完全封闭的环境,甚至不需要在系统上安装任何 python。那么为什么它不起作用?

简短的回答是因为在计算机 A 和 B 上,您的 python 的路径可能只是一个别名。您可以通过遵循计算机 B 上的路径并使用 OS 的 GUI 来验证这一点,您可以看到它是指向位于计算机其他位置的实际 python 安装的符号链接(可能是 usr/bin/).例如,在发现 Python 的多个安装的一台机器上,我看到我的虚拟环境 (.virtualenvs/revconnecion/include/python3.6) 是原始 /anaconda3/include/python3.6.

的别名

解决方案:

您可以通过在创建环境时指定 python 版本本身来创建虚拟环境:

python3.7 -m venv sharedvenv

或:

virtualenv -p python3.7

您也可以手动更改符号链接/别名,但上述方法效果更好。使用 Python 本身的特定版本来创建虚拟环境不会产生歧义,显式优于隐式。

运行 which python 在计算机 A 和 B 上验证它是否指向 Python.

的正确版本

virtualenv 没有完整的 Python 安装。相反,它 link 存在于系统 上的安装(仅供参考,link 在 <env>/lib/orig-prefix.txt 中)。 env 的目录树有一些存根和特殊逻辑,但它使用了该安装中的大部分内容。

因此,如果您 运行 activate 在一个系统上没有相同的 Python 在与创建一个 virtualenv 相同的路径上,该脚本将不会正常工作。它可能碰巧挂钩到同一路径上存在的其他东西,但这不是受支持的场景,因此所有赌注都关闭了。


如果您需要 "fully enclosed environment",您可能想看看 pyenv 正是这样做的——安装一个完整的 Python 在你的主目录下。 (或者您可以将 Python 从源安装到主目录下的某个位置——但是 pyenv 可以轻松切换到该安装并返回。)