在MacOSX Yosemite上如何同时使用Homebrew和pyenv?

9

有几个初学者关于 Homebrewpyenv 在MacOSX Yosemite上共存的问题。在这个主题上,我经过了一定程度的谷歌翻译之后仍然感到困惑。很抱歉内容有些长,但我希望尽可能清晰明了。

首先,一些背景信息。 我使用brew来安装pyenv,然后使用pyenv来安装python2和python3。

brew install pyenv
brew install pyenv-virtualenv
*I also added the necessary hooks into my profiles.*
pyenv install 2.7.10
pyenv install 3.4.3
pyenv rehash
pyenv global 2.7.10

如果brew使用由pyenv安装的Python,我认为这是不被赞同的,因为brew的软件包将使用在brew之外的依赖项进行构建(例如使用pyenv卸载Python版本可能会破坏brew的软件包)。看起来brew使用PATH中出现的第一个Python(对于我来说是pyenv的版本)?然而,在以下每种情况下,shims都是用于“python”而不是“python3”(即使是对于pyenv 3.4.3)。那么,我是否正确地认为设置“pyenv shell 3.4.3”将使brew链接Python命令(假设它们是针对python2.x的)到pyenv的Python 3.4.3,这可能会导致混乱?
pyenv shell 2.7.10
brew --config
Python: /Users/anonymous/.pyenv/shims/python => /Users/anonymous/.pyenv/versions/2.7.10/bin/python2.7
pyenv shell 3.4.3
brew --config
Python: /Users/anonymous/.pyenv/shims/python => /Users/anonymous/.pyenv/versions/3.4.3/bin/python3.4
pyenv shell system
brew --config
Python: /Users/anonymous/.pyenv/shims/python => /usr/bin/python
问题. 如果使用pyenv的python版本进行brew操作是一个不好的主意,那么我是否应该安装brew版本的python和python3呢?这样做会有冲突并导致问题吗? 我的选择似乎要么使用Mac上默认安装的系统python,要么对于所有的brew操作都使用brew自己的python。在第一种情况下,我可以确保在任何brew操作之前调用“pyenv shell system”,或者像别人建议的那样设置一些别名来自动化(alias brew="env PATH=${PATH//$(pyenv root)/shims:/} brew")。然而,这意味着我必须使用相当过时的系统python。如果我使用brew来安装python2和python3,这会与使用pyenv安装的版本产生冲突吗?还是brew的python和pyenv的完全分开的(我认为是这样,但在尝试之前我想再次确认)?这样做是否能够让我使用brew的python或python3完成所有的brew操作(我假设我仍然需要一个别名像上面那样,以确保在PATH中不首先找到pyenv的版本),而其他所有内容则使用pyenv的python版本?这样做有何不好的地方吗?

pyenv global system
*Add to profile:*
alias brew="env PATH=${PATH//$(pyenv root)\/shims:/} brew"
brew install python
brew install python3

例如,考虑这样一种情况:我想使用brew安装带有python3绑定的boost-python。这是否需要一个brew版的python3版本,并且是否会在不同的pyenv版本的python3.x上工作?如果我只安装了pyenv的版本,那么在这种情况下,--with-python3标志是否起作用?另一方面,如果我除了pyenv的版本外还安装了brew的python3,我假设--with-python3将链接到brew的python3(使用上述别名)。如果是这样,当从运行pyenv版本而不是brew版本的python会话中调用时,boost-python是否可用(不确定这是否更适合作为有关boost-python本身的问题),或者这完全没有问题?
brew install boost
brew install boost-python --with-python3

针对指向pyenv python的symlink关于brew的看法? 另一篇帖子建议将pyenv的python创建symlink以便让brew找到它们。除了明显的警告,即brew现在依赖于它自己没有管理的python,这个想法还有什么严重的问题吗?

ln -s $(brew --cellar) ~/.pyenv/versions

你能重新格式化一下,让问题更清晰明了吗?如果这些问题不是非常相似,考虑把它们拆分开来。参考http://stackoverflow.com/help/how-to-ask 来获得帮助。 - Parker
保持干净,伙计。 - durron597
最后两个主要问题已经进行了编辑以便更加清晰。如果我必须分开提出这些问题才能得到回答,那么我会这样做,但我宁愿不这样做,因为所有的问题都是相关的。 - Marcel Goldschen-Ohm
这个问题变得难以忍受。Homebrew 最糟糕的部分是它会“未经允许”地破坏 Python 环境。 - Shayne
2个回答

5

我会尽力回答你的每个问题。

1 brew 是否不建议使用 pyenv 的 Python 而不是 brew 提供的 Python?

简单来说,是的。他们在这里阐述了整个故事,简而言之,你需要自己处理可能出现的问题。

2 brew 的 Python 和 pyenv 的 Python 会冲突吗?

不会。正如Tim Smith在另一个回答中所说,“如果你这样做,不应该发生任何问题”。使用 PATH 来管理你(或应用程序)看到的 Python(这也是pyenv所做的)。

3 有 Python 依赖关系的软件包是否可以使用由 brew 提供的 Python,同时与 pyenv 的“外部”Python 兼容?

正如 Tim 所说,这不应该成为问题。

4 是否可以使用符号链接,以便我们只使用 pyenv 的 Python?

我认为你指的是这篇文章,这是个有趣的想法,但维护起来可能会很危险。顺便说一下,我现在正在这样做。我在这里介绍了如何操作。


2
答案非常有帮助。但实际情况有点糟糕 :) - blong

1
一个澄清:Homebrew在不需要特定的Python 2.7时(这很常见)会使用系统Python。如果你构建了一个 --with-python 的东西,那么它将使用PATH中的第一个Python,如果该Python是Python 2.7。否则,Homebrew将安装并使用Homebrew python。
我不认为你需要安装Homebrew的python和python3,但如果你确实这样做了,也不会有什么坏处。请注意,如果你使用pip或easy_install安装一个安装脚本的包(如ipython),那么这些脚本被编写成始终使用安装它的Python版本来调用该包。(你可以通过像python -m ipython这样运行包来绕过此行为。)否则,你可以通过设置$PATH来控制你正在使用哪个Python。
针对任何Python 3.4构建boost-python将与任何其他Python 3.4一起工作。它可能不适用于Python 3.5。(这曾经更加复杂,但现在不再是这样!)
将你的pyenv pythons符号链接到/usr/local中不会有害,但除了将它们放入$PATH之外,它没有任何作用;否则,它不会帮助Homebrew找到它们。

谢谢Tim。不过需要澄清的是,如果我使用“pyenv shell 3.4.3”和“brew install boost-python --with-python3”安装boost-python,那么如果我将python升级到3.5,那么我就必须使用brew在新版本下卸载并重新安装boost-python吗? - Marcel Goldschen-Ohm
谢谢。我会试一下的。 - Marcel Goldschen-Ohm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接