Понимание исполнения путь
Первый принцип, чтобы понять, что при установке пакетов на вашей операционной системе (виртуальной машины, что угодно) с sudo
является то, что вы устанавливаете все эти пакеты в глобальном месте, что это каталог файлов, о котором ваша система знает через переменную окружения $PATH
(PATH
).
Эта $PATH
переменная часто настройки по умолчанию в вашем .bashrc
или ваш .bash_profile
или ваш .profile
всякий раз, когда создается новый Linux/Unix пользователь. Имеете ли вы какой-либо из этих файлов, зависит от того, что находится внутри /etc/skel
в вашей системе. /etc/skel
содержит «шаблон» этих файлов, который дублируется всякий раз, когда создается новый пользователь с домашним каталогом.
При вводе echo $PATH
в командной строке, вы увидите список выполнения поиска пути, ограниченную :
, например:
/usr/local/sbin:/usr/local/bin:/usr/bin
Это пример, который я буду использовать для целей настоящего обсуждения , Различные ОС дадут вам несколько разные значения по умолчанию $PATH
, но простая идея заключается в том, что двоичные файлы ваших глобально установленных пакетов попадают в один из этих каталогов, и причина, по которой вы можете запускать эти двоичные файлы, состоит в том, что эти двоичные файлы (программы) теперь доступны в пути поиска выполнения (просто называется $PATH
).
Хорошо, но что это значит для устных переводчиков python 2 и python 3, которые я установил?
Таким образом, в отношении вашего вопроса, то это означает, что, когда вы sudo apt-get
или sudo aptitude
установить python2 или Python3 бинарные файлы (питон переводчик), они являются доступными и для дифференциации, которые interpeter вы используете в любой момент, вы бы запустить python2.7
или python3.4
, что соответственно вызывает /usr/bin/python2.7
или /usr/bin/python3.4
Вы всегда можете проверить это легко с помощью команды which
Linux/Unix. which python3.4
вернет вам точный путь, где установлен ваш двоичный файл python3.4
.
Аналогичным образом, когда вы вводите в командной строке тип pip2.7
, вы просите свою систему выполнить программу pip2.7
, которая была установлена с вашим пакетом python2.7
. И, естественно, which pip2.7
покажет вам, где был установлен бинарный файл pip2.7
.
Все это возможно только потому, что эти двоичные файлы были установлены вами с помощью sudo apt-get
и размещены в каталогах, перечисленных в $PATH
. Если вы принудительно переместите один из этих двоичных файлов в другой каталог, не указанный в $PATH
, вы поймете, что вы больше не можете запускать двоичный файл в командной строке, не набирая конкретный путь к двоичному.
Дополнительная питон конкретная информация
Питон интерпретатор имеет еще один атрибут вызова $PYTHONPATH
. Это, как вы правильно поделите, - это переменная, содержащая список каталогов («путь поиска»), где интерпретатор python будет искать модули python для загрузки. Если вы хотите знать, где ваш интерпретатор Python в настоящее время ищет модули (собственные модули питона или 3-модули партии питона), запустите
python -c "import sys; print(sys.path)"
где python
ваш конкретный интерпретатор Python. Если /usr/bin/python
символически связан с /usr/bin/python2.7
, то вы на самом деле звоните python2.7
.
Когда будет происходить путь python? Это важно в вашем собственном .py
исходном коде, когда вы запрашиваете import
других модулей. Строка кода import
в исходном коде .py
- это то, где вы просите интерпретатора python идти вперед и искать модуль, который вы хотите импортировать. Как вы можете себе представить, если ваш sys.path
(на python) пуст, вы не сможете импортировать сторонние модули.
За окровавленные детали
Теперь, когда у нас есть четкое понимание основных принципов, лежащих в $PATH
и $PYTHONPATH
, теперь мы можем понять, что virtualenv
(и, кроме того, virtualenvwrapper
полезно) делает для нас.
Когда мы создаем новый virtualenv, дающий ему каталог, мы говорим о том, что мы хотим символически ссылаться на конкретный интерпретатор python (через флаг -p python2.7
для команды virtualenv), например, для этого virtualenv.
Когда мы инициируем активацию созданного виртуального виртуального пространства, мы на самом деле вызываем сценарии оболочки, которые поставляются с virtualenv для динамического изменения $PATH
. Попробуйте запустить echo $PATH
после того, как источник активирован созданным вами виртуальным пользователем. Что ты видишь?
Это верно, вы будете видеть что-то вроде этого: -
/Users/calvin/.virtualenvs/myproject/bin:/usr/local/sbin:/usr/local/bin:/usr/bin
И если вы наберете which python
, что вы получите?
/Users/calvin/.virtualenvs/myproject/bin/python
Это верно, интерпретатор питона мы используем тот, который находится в директории virtualenv и больше не из каталога /usr/bin
.
Если запустить
ls -la /Users/calvin/.virtualenvs/myproject/bin
что вы видите?
Ах! Символическая ссылка на конкретный глобальный интерпретатор python, который вы указали при создании этого virtualenv. Если вы не видите символическую ссылку, это означает, что весь ваш интерпретатор python был скопирован с установленного на глобальном уровне.
Так вот что делает наш инструмент virtualenv. Это позволяет нам изолировать конкретные проекты и выбирать, какой интерпретатор python использовать для конкретного проекта.
Как только у вас есть источник, активированный virtualenv, ваш пип также является пипом, который находится в вашем каталоге virtualenv. Этот пип - это путь к питону. При выдаче команды pip install
, питон пакеты Теперь инсталлируется в ваш
/Users/calvin/.virtualenvs/myproject/lib/site-packages
питона каталог пакетов; и доступны ТОЛЬКО в ваш проект, когда вы активируете этот конкретный проект.
Что делать, если вы устанавливаете пакеты с sudo pip
?
sudo pip
вызывает инструмент pip, который поставляется с вашим глобально установленным интерпретатором python. Когда вы используете sudo pip
, вы устанавливаете пакеты python в глобальное местоположение (которое не заключено в тюрьму внутри virtualenv).
Я не дал вам конкретных ответов на вопрос о том, как задать вопрос о том, как я могу сделать-два-проекты-использовать-два-разные-питон-интерпретаторы. Я объяснил принципы и теперь, когда вы знаете принципы, ясно, что вам нужно делать. Ура!
: D
«Вам не следует устанавливать ничего, кроме базовых библиотек Python». Я использую root, и вместо этого я использую pip2 и pip3. Считает ли это, что избегать? –
«как минимум, вы должны убедиться, что PIL (или Pillow) можно установить, и доступны библиотеки поддержки драйверов баз данных. Для этого вы можете apt-get build-deb python-imaging psycopg2 python-mysqldb (для PostgreSQL, MySQL и PIL). " Я использую pip2 install psycopg2, а для postgres и mysql я сделал это https://gist.github.com/simkimsia/41c55e0c08eda42e2cb3#file-install-sh-L77. Это нормально? –
«Создайте виртуальную среду с базовой версией Python, поэтому virtualenv-2.7 или virtualenv-3 как обычная учетная запись пользователя без полномочий root». Можете ли вы уточнить точные командные строки? До сих пор я запускал 'pip2 install virtualenv', используя учетную запись пользователя root. Нужно ли это отменить? –