Python получает путь к фактическому исполняемому файлу Python?

#python #path

Вопрос:

Использование cygwin в Windows 10. Когда я наберу это в оболочке cygwin bash:

 $ 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 сказал мне об этом.

Ответ №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)
 

Ответ №2:

Воспользуйся os.path.realpath

 import os
import sys

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

Или

 python -c 'import sys, os; print(os.path.realpath(sys.executable))'
 

Ответ №3:

В Linux / Unix — есть readlink команда, которая следует за символической ссылкой. Вы можете вызвать это из python с помощью os модуля —

 import os
cmd_out = os.popen("readlink -f `which python`")
cmd_out.read()