我怎样才能让自制软件的 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 平台,所有内容都是从自制程序编译的。
情况非常糟糕(在每个步骤中设置 PATH
es 和 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的版本指定为system
,python
在系统中指向python 2.x
,python3
指向由自制程序安装的 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
}
从 2.7.9 切换到 python 3.4.3 后(这很简单),我经常希望在与同事分享之前用 python 2.7.9 测试我的一些脚本.我正在使用 OSX yosemite 平台,所有内容都是从自制程序编译的。
情况非常糟糕(在每个步骤中设置 PATH
es 和 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的版本指定为system
,python
在系统中指向python 2.x
,python3
指向由自制程序安装的 python@3
。
所以通常我们不需要手动给pyenv添加版本
示例:将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
}