1

在 Windows 10 上使用 cygwin。当我在 cygwin bash shell 上键入时:

$ python --version
Python 3.8.10

...我知道我拥有的默认 Python 是 3.8。但是,实际的可执行文件是什么 - 或在哪里 - 被调用?这有点难以明确找到;说,which告诉我:

$ which python
/usr/bin/python

...但如果我仔细观察:

$ ls -la /usr/bin/python*
lrwxrwxrwx 1 user None    24 Oct  1 14:06 /usr/bin/python -> /etc/alternatives/python
lrwxrwxrwx 1 user None    13 Oct  1 14:04 /usr/bin/python2 -> python2.7.exe
-rwxr-xr-x 1 user None  9235 Jan  2  2021 /usr/bin/python2.7.exe
-rwxr-xr-x 1 user None  1685 Jan  2  2021 /usr/bin/python2.7-config
lrwxrwxrwx 1 user None    16 Oct  1 14:05 /usr/bin/python2-config -> python2.7-config
lrwxrwxrwx 1 user None    25 Oct  1 14:06 /usr/bin/python3 -> /etc/alternatives/python3
lrwxrwxrwx 1 user None    14 Oct  1 14:04 /usr/bin/python3.6 -> python3.6m.exe
-rwxr-xr-x 1 user None 10259 May  5 13:22 /usr/bin/python3.6m.exe
-rwxr-xr-x 1 user None  9747 May 20 12:07 /usr/bin/python3.8.exe

所以,它/usr/bin/python实际上是一个符号链接/etc/alternatives/python它是一个带有 XML 内容的小二进制文件(编辑:错误,见下文);所以它不是Python 解释器可执行文件。

当然,我现在已经可以猜到可执行文件最有可能/usr/bin/python3.8.exe- 但是,我想从 Python 本身明确地得到这个答案。

但是,如果我这样做:

$ python -c 'import sys; print(sys.executable)'
/usr/bin/python

...我再次得到/usr/bin/python答案,这只是指向其他内容的符号链接,因此不是实际的可执行文件。

有没有办法从 Python 本身检索到实际 Python 解释器可执行文件的绝对路径?


编辑:原来/etc/alternatives/python3是实际解释器的符号链接:

$ ls -al /etc/alternatives/python3
lrwxrwxrwx 1 user None 18 Oct  1 14:06 /etc/alternatives/python3 -> /usr/bin/python3.8

...但是,我仍然想知道 Python 本身是否有办法告诉我这一点。

4

3 回答 3

1

您应该能够使用 pathlib 解析符号链接,例如:

import sys
from pathlib import Path

executable = Path(sys.executable).resolve()

如今,我总是使用pathlib.Path对象来处理路径。

或者,如果您更喜欢较旧的 API,您仍然可以使用os.path,所以

import os.path
executable = os.path.realpath(sys.executable)
于 2021-10-13T07:50:28.320 回答
1

利用os.path.realpath

import os
import sys

print(os.path.realpath(sys.executable))

或者

python -c 'import sys, os; print(os.path.realpath(sys.executable))'
于 2021-10-13T07:53:03.000 回答
0

在 Linux / Unix 上 -readlink符号链接后面有命令。os您可以使用模块从 python 中调用它-

import os
cmd_out = os.popen("readlink -f `which python`")
cmd_out.read()
于 2021-10-13T08:05:44.547 回答