Вопрос или проблема
Что-то очень неправильно происходит с настройкой моего окружения. Поскольку я пытаюсь учиться, я решил переустановить Mac OSX El Capitan на своем Macbook Pro и начать установку и настройку всего с нуля. Оболочка, которую я использую, – это ZSH, и я немного ее настроил с помощью Oh-My-ZShell.
Мой $PATH и Python:
~ ❯ echo $PATH
/Users/edchigliak/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/edchigliak/bin
~ ❯ python --version
Python 2.7.10
~ ❯
На скриншоте ниже четко показано, что в /usr/bin
установлены два Python2, а в /usr/local/bin
установлен Homebrewed Python3.
Вот результат printenv
(только записи, относящиеся к PATH и SHELL):
PATH=/Users/edchigliak/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/edchigliak/bin
PWD=/Users/edchigliak
SHELL=/usr/local/bin/zsh
SHLVL=2
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.lRGo5iu4NA/Listeners
TERM=screen-256color
ZSH=/Users/edchigliak/.oh-my-zsh
__CF_USER_TEXT_ENCODING=0x1F5:0x0:0x0
_=/usr/bin/printenv
Первая запись в моем .zshrc
:
export PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/bin
Большое спасибо!
Только бинарные файлы с именем точно python
будут рассматриваться, когда вы вводите python
в командной строке.
Если вы хотите, чтобы python
выполнял python3
, простым способом для этого является установка функции или алиаса в ваших личных файлах загрузки оболочки.
Вы абсолютно не должны заставлять python
указывать на python3
по всей системе, потому что это сломает некоторые инструменты ОС и сторонние инструменты, которые требуют, чтобы python
был версией Python 2. Эти два языка несовместимы (или, если хотите, диалекты).
Чтобы понять, что здесь происходит, когда вы вводите command
в командной строке, оболочка перебирает директории в вашем PATH
и ищет исполняемый файл с именем точно command
в каждой из них, пока не найдет его или не исчерпает все места. Она просто игнорирует любые файлы с другими именами, даже если они могут быть похожи, такие как xcommand
или commandante
или command3.xx
. Если у вас есть алиас или функция, то они будут использоваться вместо этого, хотя ваш PATH
может затем быть запрошен для поиска других команд, вызываемых вашим алиасом или функцией.
Оболочка ищет в PATH точные совпадения. Когда вы вводите python
, она пытается найти исполняемый файл, совпадающий с ^python$
; ^python...$
не то же самое.
В вашем случае может не быть python в /usr/local/bin
или, возможно, с ним есть проблема с правами доступа, из-за чего он может быть пропущен.
1) Если в /usr/local/bin
нет python
:
Вы можете использовать sudo ln -s /usr/local/bin/python3.6 /usr/local/bin/python
, чтобы создать символическую ссылку python
, указывающую на интерпретатор Python, который вы хотите использовать. Поскольку /usr/local/bin
ищется первым в вашем PATH, оболочка теперь должна найти эту ссылку.
2) Если файл существует в /usr/local/bin
но не имеет прав на выполнение, попробуйте sudo chmod a+x /usr/local/bin/python
.
Не могу сейчас придумать других проблем.
Ответ или решение
Ваша проблема с версией Python, возвращаемой при использовании оболочки ZSH, может быть связана с несколькими основными моментами. Давайте рассмотрим их более подробно.
Анализ вашей среды
-
Проверка переменной окружения
$PATH
:
Ваша переменная$PATH
выглядит следующим образом:/Users/edchigliak/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/edchigliak/bin
Обратите внимание, что
/usr/local/bin
находится в начале пути, что логично, так как там установлен ваш Python 3 из Homebrew. Однако при вводе командыpython --version
возвращается результат для Python 2.7.10, что указывает на то, что система находит и исполняет Python 2 прежде, чем дойдет до Python 3. -
Расположение интерпретаторов Python:
Существование нескольких интерпретаторов Python вполне нормально. Ваша система включает Python 2, установленный по умолчанию, и Python 3, установленный с помощью Homebrew. Однако для точного определения, какой исполняемый файл используется, полезно выполнить следующую команду:which python
Эта команда покажет путь к исполняемому файлу, который вызывается при нажатии
python
. Если он указывает на/usr/bin/python
, значит система использует старую версию Python 2.
Решения проблемы
1. Создание символической ссылки
Если вы хотите, чтобы команда python
по умолчанию использовала Python 3, вы можете создать символическую ссылку. Это можно сделать, выполнив следующую команду:
sudo ln -s /usr/local/bin/python3 /usr/local/bin/python
Эта команда создаёт символическую ссылку, что позволяет вам запускать Python 3 с помощью команды python
. Однако, учтите, что это может привести к несовместимостям с программным обеспечением, которое зависит от Python 2.
2. Использование функции или алиаса
Также вы можете создать алиас в вашем файле .zshrc
, чтобы python
указывал на python3
. Добавьте следующее в .zshrc
:
alias python=python3
Не забудьте перезагрузить ваш терминал или выполнить source ~/.zshrc
, чтобы изменения вступили в силу.
3. Проверка прав доступа
Если файл /usr/local/bin/python
существует, но не имеет прав на выполнение, выполните:
sudo chmod a+x /usr/local/bin/python
Это даёт разрешение на выполнение файла, что также может решить вашу проблему.
Взаимодействие с системным Python
Следует помнить, что прямой переход с Python 2 на Python 3 может вызвать проблемы с некоторыми системными инструментами или сторонними библиотеками, которые по-прежнему требуют Python 2. Поэтому, если вы работаете с проектами, которые зависят от Python 2, лучше указать версии явно в ваших проектах и использовать виртуальные окружения.
Заключение
Проблема с неправильной версией Python может быть вызвана многими факторами, включая конфигурацию вашего окружения и пути доступа к исполняемым файлам. Используя предоставленные методы, вы сможете настроить вашу среду так, как вам необходимо. Не забывайте тщательно проверять каждый шаг и корректировать конфигурации по мере необходимости.