我怎样才能让自制软件的 python 和 pyenv 一起生活?

How can I make homebrew's python and pyenv live together?

从 2.7.9 切换到 python 3.4.3 后(这很简单),我经常希望在与同事分享之前用 python 2.7.9 测试我的一些脚本.我正在使用 OSX yosemite 平台,所有内容都是从自制程序编译的。

情况非常糟糕(在每个步骤中设置 PATHes 和 PYTHONPATH)- 直到我发现 pyenv 可以很容易地做到这一点并且可以使用自制软件轻松安装。到目前为止,还不错。

但是,现在我使用的是这个版本的python,它不一定能和自制软件兼容。此外,我发现我可以切换回系统的 python,更一般地说,pyenv 可以访问它:

$ pyenv versions
  system
  2.7.9
* 3.4.3 (set by /usr/local/var/pyenv/version)

但是我怎么也可以添加由自制软件编译的python的条目?

您可以在您的主目录中安装 pyenv(如 pyenv 的安装指南中所述),然后在 ~/.pyenv/versions$(brew --cellar)/python:

创建一个符号链接
ln -s $(brew --cellar python)/* ~/.pyenv/versions/

现在 Homebrew 的工作方式,这将同时使用 2.x 和 3.x。

好吧,如果你想让 pyenv pythons 和 homebrew pythons 一起生活,你需要让 homebrew pythons 的名称不同于版本。否则它们将与 pyenv 使用的目录名称冲突。例如,如果你想安装 pyenv python 2.7.11 和 homebrew python 2.7.11 你可以这样做。

for i in `ls $(brew --cellar python)/`; do 
  ln -s $(brew --cellar python)/$i $HOME/.pyenv/versions/$i-brew; 
done

for i in `ls $(brew --cellar python3)/`; do 
  ln -s $(brew --cellar python)/$i $HOME/.pyenv/versions/$i-brew; 
done

基本上这将在 $HOME/.pyenv/versions 中创建一个目录并附加 '-brew' 以便它不会与 pyenv pythons.

冲突

只是添加到 @johnizzo1 的答案中,python2 现在是 python@2,因此您应该将 python3 for 循环更改为:

for i in `ls $(brew --cellar python)/`; do 
  ln -s $(brew --cellar python)/$i $HOME/.pyenv/versions/$i-brew; 
done

for i in `ls $(brew --cellar python@2)/`; do 
  ln -s $(brew --cellar python@2)/$i $HOME/.pyenv/versions/$i-brew; 
done

重新链接版本的便捷功能:

pyenv-brew-relink() {
  rm -f "$HOME/.pyenv/versions/*-brew"

  for i in $(brew --cellar python)/*; do
    ln -s --force $i $HOME/.pyenv/versions/${i##/*/}-brew;
  done

  for i in $(brew --cellar python@2)/*; do
    ln -s --force $i $HOME/.pyenv/versions/${i##/*/}-brew;
  done
}

pyenv 将在未指定版本时使用 system 作为默认版本。

当你用homebrew安装python@3时,pyenv的版本指定为systempython在系统中指向python 2.xpython3指向由自制程序安装的 python@3

所以通常我们不需要手动给pyenv添加版本


2020 年,在 `ln -s /outside/python/x.x.x ~/.pyenv/versions/x.x.x` 之后,您需要 `pyenv rehash` 来重新散列 shims。

示例:将macos系统python 2.7添加到pyenv

ln -s /System/Library/Frameworks/Python.framework/Versions/2.7 ~/.pyenv/versions/2.7

pyenv rehash

将之前答案的所有位组合在一起,形成一个实际工作的环来绑定它们:

pyenv-brew-relink() {
    rm -f "$HOME/.pyenv/versions/*-brew"
    for i in $(brew --cellar)/python* ; do
        ln -s -f "$p" "$HOME/.pyenv/versions/${i##/*/}-brew"
    done
    pyenv rehash
}