nel*_*ela 6 python macos homebrew dependency-management pyenv
brew 中的一些包需要 python@3.8 作为依赖项。例如:
$ brew deps vim
gdbm
gettext
libyaml
lua
openssl@1.1
perl
python@3.8
readline
ruby
sqlite
xz
Run Code Online (Sandbox Code Playgroud)
但是,我想用 pyenv 管理我所有的 python 安装,我不想用 brew 下载 python@3.8。这意味着必须在 2 个不同的位置安装完全相同的 python 版本,我想避免这种情况。阅读 brew、pyenv 和 python 我开始明白在系统的不同部分安装 python 可能会在未来引起一些麻烦,我也想避免这种情况。不幸的是,我似乎无法通过 pyenv 解决 brew 包中的 python 依赖项。下面按照我试图克服这个问题的步骤进行操作。
我已经用 brew 安装了 pyenv,并从那里安装了必要的 python 版本。
$ pyenv versions
system
* 3.8.2 (set by PYENV_VERSION environment variable)
Run Code Online (Sandbox Code Playgroud)
我已尝试根据此Github 讨论通过设置 brew 别名来解决此问题,例如:
alias brew='env PATH=${PATH//$(pyenv root)\/shims:/} brew'
Run Code Online (Sandbox Code Playgroud)
由于未解决的依赖问题,我试图建立一个链接python@3.8在/usr/local/Cellar其中将指向pyenv蟒蛇,在某种程度上类似于这个问题有:
ln -s ~/.pyenv/versions/3.8.2 $(brew --cellar python)@3.8
Run Code Online (Sandbox Code Playgroud)
这不起作用,所以我也尝试将链接添加到“/usr/local/bin”:
ln -s ~/.pyenv/versions/3.8.2 /usr/local/bin/python@3.8
Run Code Online (Sandbox Code Playgroud)
但是,运行brew info vim还是显示python@3.8依赖不满足。
$ brew info vim
vim: stable 8.2.0900 (bottled), HEAD
Vi 'workalike' with many additional features
https://www.vim.org/
Conflicts with:
ex-vi (because vim and ex-vi both install bin/ex and bin/view)
macvim (because vim and macvim both install vi* binaries)
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/vim.rb
==> Dependencies
Required: gettext ?, lua ?, perl ?, python@3.8 ?, ruby ?
Run Code Online (Sandbox Code Playgroud)
任何想法如何将我的 pyenv python 安装链接/连接到自制软件,以便不安装额外的 python@3.8?或者也许可以使用 pyenv global/local/shell 以另一种方式解决问题?我目前正在使用 macOS Catalina。
任何帮助是极大的赞赏!
2023-09-16 编辑
自brew版本4.1.0(2023-07-20发布)以来,有一个新命令称为pyenv-sync
$ brew pyenv-sync --help
Usage: brew pyenv-sync
Create symlinks for Homebrew's installed Python versions in ~/.pyenv/versions.
Note that older patch version symlinks will be created and linked to the minor
version so e.g. Python 3.11.0 will also be symlinked to 3.11.3.
-d, --debug Display any debugging information.
-q, --quiet Make some output more quiet.
-v, --verbose Make some output more verbose.
-h, --help Show this message.
Run Code Online (Sandbox Code Playgroud)
虽然我还没有尝试过,但这听起来像是将 Homebrew 的 Python 与 pyenv 链接的最佳选择。
编辑结束
不幸的是,从所有公式“取消链接”python有点不必要,因为每次更新您都必须“重新链接”它们。
以black为例:
$ ls -al $(brew --prefix black)/libexec/bin
total 104
drwxr-xr-x 16 thecesrom staff 512 Jun 11 08:32 .
drwxr-xr-x 6 thecesrom staff 192 Jun 11 08:32 ..
-rw-r--r-- 1 thecesrom staff 8834 Jun 10 15:27 Activate.ps1
-rw-r--r-- 1 thecesrom staff 1916 Jun 11 08:32 activate
-rw-r--r-- 1 thecesrom staff 865 Jun 11 08:32 activate.csh
-rw-r--r-- 1 thecesrom staff 2005 Jun 11 08:32 activate.fish
-rwxr-xr-x 1 thecesrom staff 256 Jun 11 08:32 black
-rwxr-xr-x 1 thecesrom staff 251 Jun 11 08:32 black-primer
-rwxr-xr-x 1 thecesrom staff 257 Jun 11 08:32 blackd
-rwxr-xr-x 1 thecesrom staff 1000 Jun 11 08:32 chardetect
-rwxr-xr-x 1 thecesrom staff 257 Jun 11 08:32 pip
-rwxr-xr-x 1 thecesrom staff 257 Jun 11 08:32 pip3
-rwxr-xr-x 1 thecesrom staff 257 Jun 11 08:32 pip3.9
lrwxr-xr-x 1 thecesrom staff 84 Jun 10 15:27 python -> ../../../../../opt/python@3.9/Frameworks/Python.framework/Versions/3.9/bin/python3.9
lrwxr-xr-x 1 thecesrom staff 84 Jun 10 15:27 python3 -> ../../../../../opt/python@3.9/Frameworks/Python.framework/Versions/3.9/bin/python3.9
lrwxr-xr-x 1 thecesrom staff 84 Jun 10 15:27 python3.9 -> ../../../../../opt/python@3.9/Frameworks/Python.framework/Versions/3.9/bin/python3.9
Run Code Online (Sandbox Code Playgroud)
请注意python, 、python3和python3.9都指向 Homebrew 的python依赖项。python因此,每次更新依赖的公式时,您都必须unlink创建所有符号链接并重新创建它们指向您pyenv安装的版本。但这仍然不会删除python通过下载的brew,并且您最终可能会在计算机上安装两个相同的 Python 版本。
解决此问题的另一种方法是将brew's添加python到pyenv。
正如您所看到的,在我的例子中,它python@3.9是作为black和其他公式的依赖项安装的,所以这就是我所做的。
首先,创建一个symlinkat ~/.pyenv/versions。
$ cd ~/.pyenv/versions
$ ln -sfv "$(brew --prefix python@3.9)" 3.9
$ ls -al
total 0
drwxr-xr-x 4 thecesrom staff 128 Aug 31 07:51 .
drwxr-xr-x 6 thecesrom staff 192 Jun 8 10:58 ..
drwxr-xr-x 6 thecesrom staff 192 Aug 31 07:48 2.7.18
lrwxr-xr-x 1 thecesrom staff 25 Aug 31 07:51 3.9 -> /usr/local/opt/python@3.9
Run Code Online (Sandbox Code Playgroud)
2021-09-06 编辑:我建议使用3.9以避免每次 Python 升级时都必须更改符号链接。
由于我想包含与通过 进行安装的其他 Python 安装 ( ) 相同的文件夹 ( bin、include、lib、 ) ,因此我为.share2.7.18pyenvinclude
$ cd "$(brew --prefix python@3.9)"
$ ln -sfv Frameworks/Python.framework/Versions/3.9/include/python3.9 include
include -> Frameworks/Python.framework/Versions/3.9/include/python3.9
Run Code Online (Sandbox Code Playgroud)
完成此操作后,我在以下位置创建symlinks了idle、pip、 :pythonwheel
$ cd "$(brew --prefix python@3.9)/bin"
$ ln -sfv idle3 idle
idle -> idle3
$ ln -sfv pip3 pip
pip -> pip3
$ ln -sfv python3 python
python -> python3
$ ln -sfv wheel3 wheel
wheel -> wheel3
Run Code Online (Sandbox Code Playgroud)
我这样做是因为我运行时得到以下输出brew link python@3.9:
$ brew link python@3.9
Warning: Already linked: /usr/local/Cellar/python@3.9/3.9.7
To relink, run:
brew unlink python@3.9 && brew link python@3.9
Run Code Online (Sandbox Code Playgroud)
完成后,每当安装新版本时,请pyenv rehash按照建议运行。pyenv
$ pyenv rehash
Run Code Online (Sandbox Code Playgroud)
然后,验证 管理的所有版本pyenv。
$ pyenv versions
system
2.7.18
* 3.9 (set by /Users/thecesrom/.pyenv/version)
Run Code Online (Sandbox Code Playgroud)
最后pyenv根据需要进行配置。就我而言,我3.9通过运行设置为全局pyenv global 3.9,现在当我运行时,python --version我得到以下输出:
$ python --version
Python 3.9.7
Run Code Online (Sandbox Code Playgroud)
首先,我很欣赏将冗余保持在最低限度的愿望!我很遗憾没有看到答案,但我想我已经找到答案了。你可以这样做,尽管 Homebrew警告不要这样做,并且你正在涉入依赖你自己的理解来支持这个用例的领域(正如 Homebrew 在他们的帖子中所述)。您链接到的 SO 问题对链接有正确的想法,但据我所知,他们的链接不太正确。我完全赞成实验和学习(这是唯一的方法?),所以无论如何都要去做,但如果你不能深入挖掘自己的方法,你将不会得到太多支持$PATH并点击您自己设置的链接。
如果您已经有任何 Homebrew 的 python3 痕迹,请首先删除它们(brew unlink python3和brew uninstall python3)。如果您已经从 Homebrew 安装了 python@3.8,则在卸载它时,请记下依赖于它的软件包(例如ffmpeg),然后重新安装它们。
截至本文,Homebrew 预计为 Python 3.8.6,因为它的 python@3.8,因此首先按照其文档使用 pyenv 安装该版本:
\npyenv install 3.8.6\nRun Code Online (Sandbox Code Playgroud)\n这将把(默认情况下)实际的Python安装放在
\n~/.pyenv/versions/3.8.6\nRun Code Online (Sandbox Code Playgroud)\n现在我们只需要添加一个链接,然后让brew 完成剩下的工作。我将在这里使用完整路径,因此您可以从任何地方运行它(并记住ln -s ... ...在头脑中读为 Link -Symbolic Target LinkName):
ln -s ~/.pyenv/versions/3.8.6 $(brew --cellar python)/3.8.6\nRun Code Online (Sandbox Code Playgroud)\n使用该-f标志,您可以省略尾随的/3.8.6,因为ln将使用目标的名称。为了使链接尽可能明确,您应该
ln -s ~/.pyenv/versions/3.8.6 /usr/local/Cellar/python@3.8/3.8.6\nRun Code Online (Sandbox Code Playgroud)\n结果应该是这样的:
\n\xe2\x9e\x9c ~ ls -alF $(brew --cellar python@3.8) \ntotal 0\nlrwxr-xr-x 1 [my username] admin 36B Oct 14 16:52 3.8.6 -> \n/Users/[my username]/.pyenv/versions/3.8.6\nRun Code Online (Sandbox Code Playgroud)\n最后,让 Homebrew 管理其余的必要链接:
\nbrew link python3\nRun Code Online (Sandbox Code Playgroud)\n