virtualenv:无法导入名称 'main'

virtualenv: cannot import name 'main'

我在 Mac OS X Yosemite 上使用 virtualenv 遇到了一些麻烦。在我一开始根本无法 运行 virtualenv 之后,我通过 brew 安装了 Python 3(之前我是通过 python.org 上的软件包安装的)。我链接了这个 python3 的安装,更新了 pip 和 运行 pip3 install virtualenv。当我尝试 运行 virtualenv(例如 $ virtualenv --python=python3 ../virtualenv)时,我收到以下错误消息。

Traceback (most recent call last):
  File "/usr/local/bin/virtualenv", line 7, in <module>
    from virtualenv import main
  File "/usr/local/bin/virtualenv.py", line 7, in <module>
    from virtualenv import main
ImportError: cannot import name 'main'

谁能帮我解决这个问题?

您的 virtualenv 可执行文件 /usr/local/bin/virtualenv 正在导入 virtualenv 包 /usr/local/bin/virtualenv.py。我的猜测是包不是可执行文件真正应该导入的包。它选择那个的原因是因为它在同一个目录中。

首先,检查真正的virtualenv包在哪里。在 python3 终端中:

>>> import virtualenv
>>> virtualenv.__file__

如果它不是 /usr/local/bin/virtualenv.py,那么让 /usr/local/bin/virtualenv 导入它而不是 /usr/local/bin/virtualenv.py 的最简单方法是删除 /usr/local/bin/virtualenv.py(或者这样你就可以轻松地如果它不起作用,请撤消此操作,只需将 virtualenv.py 重命名为其他名称,例如 xvirtualenvx.py).

升级到 Fedora 32 后,我遇到了同样的问题,这让我想到了这个问题:

ImportError: cannot import name 'main' from 'virtualenv'

就我而言,我实际上似乎同时拥有 /usr/local/bin/virtualenv$HOME/.local/lib/python3.8/site-packages/virtualenv/__init__.py

删除用户 virtualenv 版本并使用 root 将其重新安装到系统中修复了问题:

pip uninstall virtualenv
sudo pip install virtualenv

在 Linux Mint 20 上,我不得不 switch default Python interpreter to python3

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1

然后删除现有的 virtualenv 并通过 pippython3 重新安装:

rm ~/.local/bin/virtualenv 
apt remove python3-virtualenv
sudo pip install virtualenv

我在将 Ubuntu 18.04 LTS 升级到 20.04 LTS 后收到此错误。所以同时出现了两个问题。首先 python 版本仍然是 运行ning 2.x 并且进行简单的更新或尝试卸载 (apt-get remove virtualenv) virtualenv 根本没有帮助。但我找到了解决办法。首先让 20.04 LTS 'know' 使用旧 python 的时代结束了:

sudo apt-get install python-is-python3

然后测试它并打开控制台以获取版本字符串python -V;现在它应该显示类似 Python 3.8.5 的内容。很好。

下一步是解决virtualenv问题。我试图找出哪个可执行文件是 运行 和 which virtualenv,它显示:$HOME/.local/bin/virtualenv。嗯,不知何故系统没有使用 /usr/bin/virtualenv 可执行文件。我想也许我让目录变得不可见(a.k.a。重命名),也许系统会继续寻找替代方案 virtualenv 运行ning:

mv $HOME/.local/bin/virtualenv /home/USER/.local/bin/virtualenv_OLD

然后我简单地切换到一个游乐场目录和 运行 virtualenv donaldknuth 并且看到 - 它起作用了。为了确保我 运行 另一个 which virtualenv 并且系统返回了 /usr/bin/virtualenv。最后要做的检查是激活新的虚拟环境:

source $HOME/playground/donaldknuth/bin/activate

终端已更改并且运行正常。解决方案

编辑:

根据 Pierre B. 的建议,您可能需要重新启动 Shell。命令 hash -d virtualenv 将从 shell 的缓存中删除 virtualenv 的存储位置,并立即确定正确的路径。 (来源:https://www.computerhope.com/unix/bash/hash.htm, https://unix.stackexchange.com/questions/5609/how-do-i-clear-bashs-cache-of-paths-to-executables

与这里的其他人类似,我安装了多个 virtualenv。不知道多出的那个是从哪里来的,但我有这两个:

/usr/local/bin/virtualenv
/usr/bin/virtualenv

一个是virtualenv的apt install,一个是virtualenv的pip install。

升级到 Ubuntu 20.04 时发生这种情况。