#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()