将 pyenv python 链接到自制软件以避免安装自制软件 python@3.8

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。

任何帮助是极大的赞赏!

the*_*rom 9

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, 、python3python3.9都指向 Homebrew 的python依赖项。python因此,每次更新依赖的公式时,您都必须unlink创建所有符号链接并重新创建它们指向您pyenv安装的版本。但这仍然不会删除python通过下载的brew,并且您最终可能会在计算机上安装两个相同的 Python 版本。

解决此问题的另一种方法是将brew's添加pythonpyenv

正如您所看到的,在我的例子中,它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 安装 ( ) 相同的文件夹 ( binincludelib、 ) ,因此我为.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)

完成此操作后,我在以下位置创建symlinksidlepip、 :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)


And*_*gan 6

首先,我很欣赏将冗余保持在最低限度的愿望!我很遗憾没有看到答案,但我想我已经找到答案了。你可以这样做,尽管 Homebrew警告不要这样做,并且你正在涉入依赖你自己的理解来支持这个用例的领域(正如 Homebrew 在他们的帖子中所述)。您链接到的 SO 问题对链接有正确的想法,但据我所知,他们的链接不太正确。我完全赞成实验和学习(这是唯一的方法?),所以无论如何都要去做,但如果你不能深入挖掘自己的方法,你将不会得到太多支持$PATH并点击您自己设置的链接。

\n

如果您已经有任何 Homebrew 的 python3 痕迹,请首先删除它们(brew unlink python3brew uninstall python3)。如果您已经从 Homebrew 安装了 python@3.8,则在卸载它时,请记下依赖于它的软件包(例如ffmpeg),然后重新安装它们。

\n

截至本文,Homebrew 预计为 Python 3.8.6,因为它的 python@3.8,因此首先按照其文档使用 pyenv 安装该版本:

\n
pyenv install 3.8.6\n
Run Code Online (Sandbox Code Playgroud)\n

这将把(默认情况下)实际的Python安装放在

\n
~/.pyenv/versions/3.8.6\n
Run Code Online (Sandbox Code Playgroud)\n

现在我们只需要添加一个链接,然后让brew 完成剩下的工作。我将在这里使用完整路径,因此您可以从任何地方运行它(并记住ln -s ... ...在头脑中读为 Link -Symbolic Target LinkName):

\n
ln -s ~/.pyenv/versions/3.8.6 $(brew --cellar python)/3.8.6\n
Run Code Online (Sandbox Code Playgroud)\n

使用该-f标志,您可以省略尾随的/3.8.6,因为ln将使用目标的名称。为了使链接尽可能明确,您应该

\n
ln -s ~/.pyenv/versions/3.8.6 /usr/local/Cellar/python@3.8/3.8.6\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n

最后,让 Homebrew 管理其余的必要链接:

\n
brew link python3\n
Run Code Online (Sandbox Code Playgroud)\n