【问题标题】:virtualenv: cannot import name 'main'virtualenv:无法导入名称“主”
【发布时间】:2015-12-27 11:52:41
【问题描述】:

我在 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'

谁能帮我解决这个问题?

【问题讨论】:

    标签: python-3.x virtualenv


    【解决方案1】:

    您的 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 之类的其他名称。

    【讨论】:

    • 其他文件可能是安装 virtualenv 的其他尝试或其他版本的 python 遗留下来的。如果打开它,您可能会看到它与您正在执行的文件是同一个文件。它可能与不同版本的 python 相关联,您会在脚本开头的 shebang 中看到它。
    【解决方案2】:

    升级到 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
    

    【讨论】:

    • 这不是正确的方法。用户可能不想在系统文件夹中安装 virtualenv 并将所有内容都包含在主文件夹中
    【解决方案3】:

    在 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
    

    【讨论】:

      【解决方案4】:

      我在将 Ubuntu 18.04 LTS 升级到 20.04 LTS 后收到此错误。所以一下子就出现了两个问题。首先,python 版本仍在运行 2.x 并进行简单更新或尝试卸载 virtualenv (apt-get remove virtualenv) 根本没有帮助。但我找到了解决方案。首先让 20.04 LTS '知道' 使用旧 python 的时代已经结束:

      sudo apt-get install python-is-python3
      

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

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

      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.htmhttps://unix.stackexchange.com/questions/5609/how-do-i-clear-bashs-cache-of-paths-to-executables

      【讨论】:

      • 为我解决了。并不是说使用 bash 您可能需要重新启动 bash 会话或运行 hash -r,因为缓存将指向旧的 virtualenv 路径(请参阅 unix.stackexchange.com/questions/5609/…
      • 太棒了。谢谢。
      • 为什么那个奇怪(和错误)的命令?您可能想要$USER 而不是USER,但在两个实例(源和目标)中传递相同的根路径更加一致:mv $HOME/.local/bin/virtualenv $HOME/.local/bin/virtualenv_OLD
      【解决方案5】:

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

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

      一个来自 virtualenv 的 apt install,另一个来自 virtualenv 的 pip install。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-17
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 2020-02-05
        • 2011-07-11
        • 2018-06-11
        相关资源
        最近更新 更多