#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.
- Почему
which python3
возвращается другой путь, чем тот, который я вижу приll
/usr/bin/python*
входе . Я имею в виду, что и то, и другое существует… Итак, почему же/Library/Frameworks/Python.framework/Versions/3.9/bin/python3
предпочтительнее? - Почему для python3 нет символической ссылки? Что пошло не так во время установки?
- Является ли «безопасным» просто
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
. Если он не сломан, то не чините его.