Почему и как: Отсутствует символическая ссылка для python3?

#python #macos

Вопрос:

Я на macOS 10.15.7.

Мне нужно и python2 то, и python3 другое . Я новичок, поэтому часто с трудом понимаю многие термины. Сокурсник сказал мне, что -> это символические ссылки.

Когда я бегу me$ which python3 , я получаю:

 /Library/Frameworks/Python.framework/Versions/3.9/bin/python3
 

Но при проверке ll /usr/bin/python*

 lrwxr-xr-x  1 root  wheel    75B Oct  9  2019 /usr/bin/python -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
lrwxr-xr-x  1 root  wheel    82B Oct  9  2019 /usr/bin/python-config -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7-config
lrwxr-xr-x  1 root  wheel    75B Oct  9  2019 /usr/bin/python2 -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
lrwxr-xr-x  1 root  wheel    75B Oct  9  2019 /usr/bin/python2.7 -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
lrwxr-xr-x  1 root  wheel    82B Oct  9  2019 /usr/bin/python2.7-config -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7-config
-rwxr-xr-x  1 root  wheel    31K Oct 30  2020 /usr/bin/python3
lrwxr-xr-x  1 root  wheel    76B Oct  9  2019 /usr/bin/pythonw -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/pythonw2.7
lrwxr-xr-x  1 root  wheel    76B Oct  9  2019 /usr/bin/pythonw2.7 -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/pythonw2.7
 

Все выглядит так же, за исключением строки, касающейся python3.

  1. Почему which python3 возвращается другой путь, чем тот, который я вижу при ll /usr/bin/python* входе . Я имею в виду, что и то, и другое существует… Итак, почему же /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 предпочтительнее?
  2. Почему для python3 нет символической ссылки? Что пошло не так во время установки?
  3. Является ли «безопасным» просто manually создать символическую ссылку между /usr/bin/python3 и /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 , как показано здесь. ln -s /path/to/original/ /path/to/link Будучи новичком, я бы предпочел сначала спросить в Интернете 😉

Я рад отредактировать свой вопрос в соответствии с вашими предложениями, так как я здесь, чтобы учиться — и, надеюсь, скоро также помочь.

Спасибо за вашу помощь.

Комментарии:

1. Можете ли вы поделиться тем, как вы установили python3? Python, присутствующий в /Library/Frameworks/Python.framework/Versions/ , является системным исполняемым файлом python, который использует macOS. Они получают символические ссылки в /usr/bin/, чтобы сделать их доступными для пользователя, но обычно (и нормально) перезаписывать эти символические ссылки исполняемыми файлами, установленными пользователем.

2. @MatteoZanoni честно говоря, я не помню, как я установил, мне жаль, что это было несколько месяцев назад.

Ответ №1:

На самом деле здесь есть довольно много исследований.

2.7 Python-это используемый Apple Python, лучше оставьте его в покое. Я бы также оставил существующий /usr/bin/python3 в покое и не заменял его символической ссылкой. Что касается результатов, то они зависят от содержимого переменной PATH. где бы что-то ни было впервые найдено, это то, откуда оно взято. /Library/Frameworks/Python.framework/Versions/3.9/bin/ должны предшествовать /usr/bin в ПУТИ, и у них обоих есть python3 запись.

Самый простой способ иметь стабильный Python для работы (и нет, я не рекомендую Python 2.7 как часть этого) — использовать macport или brew для установки Python, которые устанавливают символические ссылки Python в заданный каталог, отдельно от системных каталогов, таких как /usr/bin .

(но обратите внимание на комментарий Чепнера о брю, похоже, он что-то задумал и, вероятно, забыл о Python больше, чем я когда-либо знал)

Затем используйте virtualenv или эквивалент, чтобы выбрать правильный Python для использования в данном проекте.

Я бы придерживался общей политики, оставляя содержание /usr/bin в покое, если у вас нет действительно веской причины.

Это учебник по структуре каталогов macos с акцентом на ПУТЬ.

Если вы хотите увидеть, что находится на вашем ПУТИ, вы можете echo $PATH или сделаете следующее:

создать файл myshellutils.sh :

вставьте в следующее:

 showpath ()
{
    IFS=':' read -a array <<< "$PATH";
    for index in "${!array[@]}";
    do
        echo "$index ${array[index]}";
    done
}
 

сохраните его, затем введите source myshellutils.sh . Это создает новую функцию оболочки, showpath .

который вы можете использовать следующим образом (некоторые материалы удалены).

 (venv38) me@bin$ showpath
0 /Users/me/.cargo/bin
1 /Users/me/venv38/bin   👈 this is where the VirtualEnv-activated version of Python lives
3 /opt/local/bin 👈 where macports puts things 
4 /usr/local/bin 👈 where brew puts things.  Yes, I had to use both.
5 /usr/bin 👈 Apple stuff, leave alone.
6 /bin
7 /usr/sbin
8 /sbin
10 /opt/local/sbin
12 /Users/me/bin

 

И последнее, но не менее важное… символическая ссылка? Что за чушь? На самом деле довольно умная идея, это в основном указатель или маркер, если хотите, на другой файл в другом месте с потенциально другим именем.

итак, скажите, что ваши программы указывают, какой Python запускать

foo.py:

 #!/usr/bin/env python
print("hello")
 

итак, сначала давайте which -a python (хороший звонок на-а, Л. Грозингер )

который получает

 /Users/me/venv38/bin/python
 

давайте там компакт-диск, а затем ls -l python* с разрезом, чтобы избавиться от всего, что связано с пользователем и размером.

 $ls -l  python* | cut -c 46-

python -> python3.8  👈 1️⃣ your entry point for where foo.py looks for "python".  now look for "python3.8"
python3 -> python3.8
👇 2️⃣ which resolves to where macport installs 
python3.8 -> /opt/local/Library/Frameworks/Python.framework/Versions/3.8/bin/python3.8  binaries.

 

Умная штука? Когда вы установите Python 3.9, он будет связан с by python -> python3.9 , и foo.py ему будет все равно.

Комментарии:

1. Странно, что там есть первые 2 предложения

2. Ну, оперативная группа сочла необходимым пожаловаться на повышение голосов по старым материалам, а также не сказала нам, что они были на Mac. Да, может быть неприятно видеть 26-тысячного пользователя, чей основной вклад 16 лет назад состоял в том, чтобы «как мне использовать git commit «, но такова жизнь.

3. Можно привести аргумент, что также не следует использовать brew Python . Лично я использую nix для разработки конкретную версию Python.

4. @чепнер интересно. Мой Python от macports, brew очень вторичен, я использую его только потому, что некоторые пакеты, такие как MS-драйвер MSSQL, IIRC, поставляемый MS, были только на brew. Лично я ничего не имею против брю, только что начал работать в Макпорте. Однако относительному новичку в Python/macos лучше всего подойдет менеджер пакетов.

5. @ilamengl не волнуйся. мой комментарий был немного язвительным. и сообщество Python, как правило, гордится тем, что оно дружелюбно к новичкам. но да, есть много людей, у которых действительно очень сильные чувства по поводу того, как должно быть и как не должно быть. они будут безжалостны, потому что вы не поняли, что ваш вопрос был задан 7,9 года назад, используя другое название, и закройте его как дубликат. тем не менее, большая часть системных или многокомпонентных вопросов (например, проблемы с веб-сервером сервером баз данных) заключается в том, чтобы указать вашу систему, ваш веб-сервер, вашу СУБД и, возможно, версии.

Ответ №2:

С главной which страницы

который возвращает имена путей к файлам (или ссылкам), которые были бы выполнены в текущей среде, если бы его аргументы были заданы в виде команд в строго соответствующей POSIX оболочке

и в списке опций

    -a     print all matching pathnames of each argument
 

Итак, без -a этого , which просто печатает первое «попадание» на вашем PATH . Так, например , если /Library/Frameworks/Python.framework/Versions/3.9/bin раньше /usr/bin в вашем PATH , which python3 вернется только один.

Я был бы готов поспорить, что ваш бег which -a python3 вернется:

 /Library/Frameworks/Python.framework/Versions/3.9/bin
/usr/bin/python3
 

Ваша установка прошла нормально, просто у вас установлено более одного python3 исполняемого файла. Также нет необходимости делать какие-либо дополнительные символические ссылки.

Комментарии:

1. Спасибо, если нет необходимости в дополнительных символических ссылках — почему тогда python2.7 связан символическими ссылками?

2. может быть множество причин, различные процессы установки могут использовать или не использовать символические ссылки. Но на самом деле, пока фактический исполняемый файл находится на вашем ПУТИ, они излишни. Иногда вам могут понадобиться символические ссылки по техническим причинам или потому, что вам нужны псевдонимы для определенных команд, например, ваши python2 и python2.7 являются псевдонимами

3. Но разве плохо, что у меня есть 2 разных пути для python3? Как вы думаете, мне следует изменить вопрос на «Почему у меня 2 разных пути для python3?»

4. Не совсем. На самом деле у вас нет «2 разных пути для python3». У вас есть 2 исполняемых файла python3, оба находятся на вашем ПУТИ. Возможно, это даже 2 разные версии Python3. Сравните результаты python3 --version с /usr/bin/python3 --version

5. «Мне не нужен конкретный python3 для любых программ, которые я использую» — это вам известно… для какой-то важной системной штуки может потребоваться определенная версия или вы ожидаете ее найти /usr/bin/python3 . Если он не сломан, то не чините его.