【问题标题】:virtualenv on macOS uses nonexistent python interpretermacOS 上的 virtualenv 使用不存在的 python 解释器
【发布时间】:2018-08-10 18:52:05
【问题描述】:

当我运行 virtualenv 时,我得到了这个:

$ virtualenv
-bash: /usr/local/bin/virtualenv: /usr/local/opt/python/bin/python2.7: bad interpreter: No such file or directory

virtualenv 今天才开始这样做。它昨天奏效了。它中断是因为virtualenv 是一个使用不存在的 Python 解释器的 Python 脚本:

$ head -1 $(which virtualenv)
#!/usr/local/opt/python/bin/python2.7

在我的机器上,/usr/local/opt/python 是指向 Python 3.6 目录的符号链接:

$ ls -l /usr/local/opt/python
lrwxr-xr-x  1 jim  admin  24  2 Mar 13:45 /usr/local/opt/python -> ../Cellar/python/3.6.4_3

正如预期的那样,Python 3.6 目录不包含bin/python2.7

$ ls /usr/local/Cellar/python/3.6.4_3/bin/
2to3            idle            pip3            pydoc3.6        python3-config      python3.6m-config   wheel3
2to3-3.6        idle3           pip3.6          python          python3.6       pyvenv
easy_install        idle3.6         pydoc           python-config       python3.6-config    pyvenv-3.6
easy_install-3.6    pip         pydoc3          python3         python3.6m      wheel

virtualenv 显然期望 /usr/local/opt/python 包含 Python 2 材料,但它只包含 Python 3 材料。

我的/usr/local/opt/python 由 Homebrew 管理。我不知道我的virtualenv 的出处。如何知道我的/usr/local/bin/virtualenv 来自哪里?

谁是罪魁祸首?我的 virtualenv 还是 Homebrew?

【问题讨论】:

    标签: python macos virtualenv homebrew


    【解决方案1】:

    这要归咎于pip,而不是 Homebrew。我的/usr/local/bin/virtualenv 来自pip install virtualenv,它在安装时嵌入了指向 Python 解释器的绝对链接!我已经打开an issue about this unidiomatic behavior

    【讨论】:

    • 我重写了 /usr/local/bin/virtualenv 中的 hash-bang 以指向 /usr/local/bin/python2 处的别名 python。
    【解决方案2】:

    首先,很抱歉在这里添加单独的评论——我缺乏对@jameshfisher 的回答添加评论的声誉。

    我用自制软件将macos上的python2更新到最新版本:

    ~ ❯❯❯ python2 --version
    Python 2.7.15
    

    创建/更新 /usr/local/bin 中的 python2 符号链接以链接到特定的 brew 安装更新:

    ~ ❯❯❯ ls -ahl =python2
    lrwxr-xr-x  1 michael  admin    39B  3 Jul 17:11 /usr/local/bin/python2 -> ../Cellar/python@2/2.7.15_1/bin/python2
    

    /usr/local/bin/virtualenv 中的 shebang 是:

    ~ ❯❯❯ head -1 $(which virtualenv)
    #!/usr/local/opt/python/bin/python2.7
    

    不存在的:

    ~ ❯❯❯ ls -l /usr/local/opt/python/bin/python2.7
    ls: /usr/local/opt/python/bin/python2.7: No such file or directory
    

    因此将shebang修改为#!/usr/local/bin/python2以使用brew安装的更新python2版本是最合适的方法:

    ~ ❯❯❯ virtualenv --version
    15.1.0
    

    ✨?✨

    对我来说,一个红鲱鱼是我错误地认为输入 which python 会给我提供我的 python2 版本的路径:

    ~ ❯❯❯ which python
    /Users/michael/.pyenv/shims/python
    ~ ❯❯❯ which python2
    /usr/local/bin/python2
    ~ ❯❯❯ which python3
    /Users/michael/.pyenv/shims/python3
    
    ~ ❯❯❯ /Users/michael/.pyenv/shims/python --version
    Python 3.7.0
    

    我忘记了我已将 pyenv global 设置为 python 3.7.0。请不要像我一样掉入那个陷阱! ✨?✨

    【讨论】:

    • 感谢 @jameshfisher 也提出了 pip 问题——这个讨论也对我帮助很大!
    【解决方案3】:

    在我的 Mac 上出现同样的问题。也许当我更新到 Mojave 时它坏了?谁知道呢。

    通过brew 安装 Python 2 解决:

    brew install python2
    

    这现在取代了我工厂安装的 Python 2.7,并为我提供了一个新的 virtualenv,它可以工作:

    $ which virtualenv
    /usr/local/bin/virtualenv
    

    【讨论】:

      最近更新 更多