在 中/bin
,我运行了:
$ ls -l python3
lrwxrwxrwx 1 root root 10 Aug 8 01:44 python3 -> python3.12
$ python3 --version
Python 3.12.3
$ python3.12 --version
Python 3.12.5
有人能解释为什么当它们是符号链接时一个是“Python 3.12.3 ”,另一个是“Python 3.12.5 ”吗?
在 中/bin
,我运行了:
$ ls -l python3
lrwxrwxrwx 1 root root 10 Aug 8 01:44 python3 -> python3.12
$ python3 --version
Python 3.12.3
$ python3.12 --version
Python 3.12.5
有人能解释为什么当它们是符号链接时一个是“Python 3.12.3 ”,另一个是“Python 3.12.5 ”吗?
要找出他们从哪里跑来,你可以使用:
编辑:正如@muru 提到的,您应该使用
type
它,因为它是一个 shell 内置的、符合 POSIX 的命令:$PATH
当你输入一个命令时,你的 shell 将按照列出的顺序在每个目录中查找它,并执行它找到的第一个命令。例如,如果您输入
zorglub
并且您的$PATH
包含/usr/local/bin:/usr/bin:/bin
,那么:/usr/local/bin/zorglub
存在且可执行。如果是,它将执行该命令并停止。/usr/bin/zorglub
/bin/zorglub
$PATH
您可以通过输入来检查值$PATH
以冒号分隔,并且它在您的 shell 启动脚本中设置(并且通常会添加到)。您得到的结果(似乎是相同的命令返回不同的版本)意味着您可能在除 之外的某个目录中有另一个
python3
and/or ,其版本与 中的版本不同。通常可能的位置可能包括、、,以及根据您的环境的其他一些位置。python3.12
/bin
/bin
/usr/bin
/usr/local/bin
/opt/local/bin
例如,您
$PATH
可以将 设置为/usr/local/bin:/usr/bin:/bin
并且/usr/local/bin
包含python3
,其(直接或间接)是版本 3.12.3,并且由于/usr/local/bin
是第一个,因此python3
无条件地将执行该版本而不是 中的版本/bin
。另一方面,如果python3.12
仅存在于 中/bin
,它将回退到该版本,即 3.12.5。或反过来。which python3
和会分别告诉您输入和which python3.12
时运行哪一个。python3
python3.12
如果您想要专门执行
python3
或python3.12
,/bin
则需要执行以下操作之一:/bin
,然后运行./python3
或./python3.12
(它们应该产生相同的结果,因为一个是另一个的符号链接)/bin/python3
或/bin/python3.12
python3
或。python3.12
/bin
$PATH
当您有不同的包管理器,或者混合使用包管理器和手动安装的软件时,遗憾的是,软件安装在不同的位置是很常见的,这可能会导致各种各样的问题,特别是如果一个 python 脚本由于某种原因通过 shell 运行另一个 python 脚本。
对于 Python(以及许多其他程序)而言,这种情况更为严重,因为每个版本的可执行文件可能使用不同的 Python 包路径。您的 Python 包管理器(
pip
)也可能安装了多个版本,这些版本位于不同的位置并指向不同的位置。它很快就会变得有点混乱,告诉pip install
您某些东西已安装并且是最新的,而python
告诉您它不是。最好确保所有版本都python
通过相同的方式安装(发行版的包管理器或手动安装),而不是两者混合。如果你的 python3 代码以以下内容开头:
那么你的代码将自动使用python3.12执行。
如果你决定更新到 python3.15,那么你只需更新 python3 链接以指向 python3.15。然后你的所有代码都将运行 3.15。
如果您对 3.15 版本有疑问,您可以将链接改回指向已知良好的 python3.12,而无需更改任何代码。