Каков правильный способ установки pip, virtualenv и дистрибутива для Python?

Короткий вопрос

Фон

В мой ответ на вопрос SO 4314376, я рекомендовал использовать ez_setup, чтобы потом установите pip и virtualenv следующим образом:

curl -O http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
sudo easy_install pip
sudo pip install virtualenv

Я изначально вытащил эти инструкции из сообщения Джесси Ноллер Итак, вы хотите использовать Python на Mac?. Мне нравится идея сохранения чистого каталога сайтов-сайтов, поэтому только другие пакеты, которые я устанавливаю там, virtualenvwrapper и distribute. (Недавно я добавил distribute в свой инструментарий из-за этой общественной службы Python объявление. Чтобы установить эти два пакета, я использовал:

sudo pip install virtualenvwrapper
curl -O http://python-distribute.org/distribute_setup.py
sudo python distribute_setup.py

Больше настроек setuptools и easy_install

Чтобы действительно следовать что публичное оповещение Python, на новой установке Python я бы сделал следующее:

curl -O http://python-distribute.org/distribute_setup.py
sudo python distribute_setup.py
sudo easy_install pip
sudo pip install virtualenv
sudo pip install virtualenvwrapper

Подтверждение глифа

В комментарии к моему ответу на SO вопрос 4314376, пользователь SO Glyph:

НЕТ. НИКОГДА НЕ выполняйте sudo python setup.py install все. Напишите файл ~/.pydistutils.cfg, который добавит вашу установку pip в ~/.local или что-то еще. Особенно файлы с именем ez_setup.py имеют тенденцию высасывать более новые версии таких вещей, как setuptools и easy_install, что может потенциально нарушить другие вещи в вашей операционной системе.

Вернуться к короткому вопросу

Итак Ответ на глиф приводит меня к моему первоначальному вопросу:

Ответ 1

Вы можете сделать это, не установив ничего в сам python.

Вам не нужны sudo или какие-либо привилегии.

Вам не нужно редактировать какие-либо файлы.

Установите virtualenv в виртуальную среду bootstrap. Используйте эту виртуальную среду, чтобы создать больше. Поскольку virtualenv поставляется с пипсом и распространяется, вы получаете все от одной установки.

  • Загрузить virtualenv:
  • Распаковать исходный архив
  • Используйте распакованный tarball для создания чистой виртуальной среды. Эта виртуальная среда будет использоваться для "начальной загрузки" других. Все ваши виртуальные среды будут автоматически содержать pip и распространять.
  • Используя pip, установите virtualenv в среду бутстрапа.
  • Используйте эту загрузочную среду, чтобы создать больше!

Вот пример в bash:

# Select current version of virtualenv:
VERSION=12.0.7
# Name your first "bootstrap" environment:
INITIAL_ENV=bootstrap
# Set to whatever python interpreter you want for your first environment:
PYTHON=$(which python)
URL_BASE=https://pypi.python.org/packages/source/v/virtualenv

# --- Real work starts here ---
curl -O $URL_BASE/virtualenv-$VERSION.tar.gz
tar xzf virtualenv-$VERSION.tar.gz
# Create the first "bootstrap" environment.
$PYTHON virtualenv-$VERSION/virtualenv.py $INITIAL_ENV
# Don't need this anymore.
rm -rf virtualenv-$VERSION
# Install virtualenv into the environment.
$INITIAL_ENV/bin/pip install virtualenv-$VERSION.tar.gz

Теперь вы можете использовать среду "bootstrap", чтобы создать больше:

# Create a second environment from the first:
$INITIAL_ENV/bin/virtualenv py-env1
# Create more:
$INITIAL_ENV/bin/virtualenv py-env2

Перейдите на гайки!

Примечание

Это предполагает, что вы не используете действительно старую версию virtualenv. Для старых версий требовались флаги --no-site-packges (и в зависимости от версии Python, --distribute). Теперь вы можете создать свою загрузочную среду только с python virtualenv.py path-to-bootstrap или python3 virtualenv.py path-to-bootstrap.

Ответ 2

Я думаю, что Glyph означает сделать что-то вроде этого:

  • Создайте каталог ~/.local, если он еще не существует.
  • В ~/.bashrc убедитесь, что ~/.local/bin включен PATH и что ~/.local включен PYTHONPATH.
  • Создайте файл ~/.pydistutils.cfg, содержащий

    [install]
    prefix=~/.local
    

    Это стандартный файл в формате ConfigParser.

  • Загрузить distribute_setup.py и запустите python distribute_setup.py (no sudo). Если он жалуется на несуществующий каталог site-packages, создайте его вручную:

    mkdir -p ~/.local/lib/python2.7/site-packages/

  • Запустите which easy_install, чтобы убедиться, что он исходит из ~/.local/bin

  • Запустить pip install virtualenv
  • Запустить pip install virtualenvwrapper
  • Создайте папку, содержащую виртуальную env, скажем ~/.virtualenvs
  • В ~/.bashrc добавить

    export WORKON_HOME
    source ~/.local/bin/virtualenvwrapper.sh
    

Чтобы он вообще не использовался sudo, а ваша среда Python находится в ~/.local, полностью отделена от ОС Python. Отказ от ответственности: не уверен, насколько совместим virtualenvwrapper в этом сценарии - я не смог проверить его в своей системе: -)

Ответ 3

Если вы выполните шаги, указанные в нескольких учебниках, которые я связал в этом ответе, вы может получить желаемый эффект без нескольких сложных "ручных" шагов в ответах Уокера и Винай. Если вы на Ubuntu:

sudo apt-get install python-pip python-dev

Эквивалент достигается в OS X с помощью homebrew для установки python (подробнее здесь).

brew install python

С установленным pip вы можете использовать его для получения оставшихся пакетов (вы можете опустить sudo в OS X, поскольку вы используете локальную установку python).

sudo pip install virtualenvwrapper

(это единственные пакеты, которые вам нужно установить глобально, и я сомневаюсь, что он столкнется с чем-либо системным уровнем от ОС. Если вы хотите быть супербезопасным, вы можете сохранить версии дистрибутива sudo apt-get install virtualenvwrapper)

Примечание: в Ubuntu 14.04 Я получаю некоторые ошибки с установкой pip, поэтому я использую pip3 install virtualenv virtualenvwrapper и добавьте VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 в мой файл .bashrc/.zshrc.

Затем вы добавляете в свой .bashrc файл

export WORKON_HOME
source /usr/local/bin/virtualenvwrapper.sh

и исправить его

. ~/.bashrc

Это в основном это. Теперь единственным решением является то, хотите ли вы создать virtualenv для включения пакетов системного уровня.

mkvirtualenv --system-site-packages foo

где существующие системные пакеты не нужно переустанавливать, они привязаны к версиям системного интерпретатора. Примечание: вы все равно можете установить новые пакеты и обновить существующие входящие в комплект пакеты без sudo - я протестировал его, и он работает без каких-либо сбоев в работе системного интерпретатора.

[email protected]:~$ sudo apt-get install python-pandas
[email protected]:~$ mkvirtualenv --system-site-packages s
(s)[email protected]:~$ pip install --upgrade pandas
(s)[email protected]:~$ python -c "import pandas; print(pandas.__version__)"
0.10.1
(s)[email protected]:~$ deactivate
[email protected]:~$ python -c "import pandas; print(pandas.__version__)"
0.8.0

Альтернативой, если вы хотите полностью изолированную среду, является

mkvirtualenv --no-site-packages bar

или если задана опция по умолчанию, просто

mkvirtualenv bar

В результате у вас есть новый virtualenv, где вы можете свободно и грубо установить свои любимые пакеты

pip install flask

Ответ 4

Python 3.4 вперед

Python 3.3 добавляет модуль venv, а Python 3.4 добавляет модуль обеспечения. Это делает загрузочный диск проще:

python -m securitypip

Возможно, предшествует вызов venv, чтобы сделать это внутри виртуальной среды.

Гарантированный пипс описан в PEP 453.

Ответ 5

В Ubuntu:

sudo apt-get install python-virtualenv

Пакет python-pip является зависимым, поэтому он также будет установлен.

Ответ 6

Обновление: По состоянию на июль 2013 года этот проект больше не поддерживается. Автор предлагает использовать pyenv. (pyenv не имеет встроенной поддержки для virtualenv, но отлично играет с ним.)

Pythonbrew - это менеджер версий для python и поставляется с поддержкой virtualenv.

После установки pythonbrew и python-версии с помощью venvs очень просто:

# Initializes the virtualenv 
pythonbrew venv init

# Create a virtual/sandboxed environment 
pythonbrew venv create mycoolbundle  

# Use it 
pythonbrew venv use mycoolbundle

Ответ 7

Я сделал эту процедуру для использования на работе.

cd ~
curl -s https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz | tar xvz
cd pip-1.3.1
python setup.py install --user
cd ~
rm -rf pip-1.3.1

$HOME/.local/bin/pip install --user --upgrade pip distribute virtualenvwrapper

# Might want these three in your .bashrc
export PATH=$PATH:$HOME/.local/bin
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS="--distribute"
source $HOME/.local/bin/virtualenvwrapper.sh

mkvirtualenv mypy
workon mypy
pip install --upgrade distribute
pip install pudb # Or whatever other nice package you might want.

Ключевые моменты для безопасности:

  • curl делает проверку ssl. wget не делает.
  • Начиная с pip 1.3.1, pip также выполняет проверку ssl.
  • Меньше пользователей может загружать архив pypi, чем tar файл github.

Ответ 8

Нет проблем с установкой sudo python setup.py, если вы уверены, что хотите сделать.

Разница в том, что он будет использовать каталог сайтов-пакетов вашей ОС в качестве места назначения для файлов .py, которые нужно скопировать.

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

Ответ 10

Недавно я столкнулся с той же проблемой. Я становлюсь более частичным для мышления "всегда использовать виртуальный", поэтому моя проблема заключалась в том, чтобы установить virtualenv с помощью pip без установки дистрибутива в мой глобальный или пользовательский каталог сайтов. Для этого я вручную загрузил дистрибутив, pip и virtualenv, и для каждого из них я запускал "python setup.py install --prefix ~/.local/python-private" (с временной установкой PYTHONPATH = ~/.local/python-private), чтобы скрипты установки могли найти дистрибутив). Ive переместил virtualenv script в другой каталог, который у меня есть на моем PATH, и отредактировал его, чтобы модули распространения и virtualenv можно было найти на sys.path. Tada: Я не устанавливал ничего в каталог /usr,/usr/local или my user site-packages, но я могу запускать virtualenv в любом месте, и в этом virtualenv я получаю pip.

Ответ 11

  • Вы можете сделать это, не устанавливая ничего в сам python.

  • Вам не нужны sudo или какие-либо привилегии.

  • Вам не нужно искать последнюю версию tar файла virtualenv

  • Вам не нужно редактировать информацию о версии в bash script, чтобы поддерживать актуальность.

  • Вам не нужно устанавливать curl/wget или tar, а не pip или easy_install

Сохраните следующее значение в /tmp/initvenv.py:

from __future__ import print_function

import os, sys, shutil, tempfile, subprocess, tarfile, hashlib

try:
    from urllib2 import urlopen
except ImportError:
    from urllib.request import urlopen

tmp_dir = tempfile.mkdtemp(prefix='initvenv_')
try:
    # read the latest version from PyPI
    f = urlopen("https://pypi.python.org/pypi/virtualenv/")
    # retrieve the .tar.gz file
    for line in f.read().splitlines():
        if isinstance(line, bytes):
            line = line.decode('utf-8')
        if 'tar.gz<' not in line:
            continue
        for url in line.split('"'):
            if url.startswith('http'):
                url, md5 = url.split('#')
                assert md5.startswith('md5=')
                md5 = md5[4:]
                break
        else:
            continue
        break
    else:
        print('tar.gz not found')
        sys.exit(1)
    file_name = url.rsplit('/', 1)[1]
    print(file_name)
    # url = "https://pypi.python.org/packages/source/v/virtualenv/" + file_name
    os.chdir(tmp_dir)
    with open(file_name, 'wb') as fp:
        data = urlopen(url).read()
        data_md5 = hashlib.md5(data).hexdigest()
        if md5 != data_md5:
            print('md5 not correct')
            print(md5)
            print(data_md5)
            sys.exit(1)
        fp.write(data)
    tar = tarfile.open(file_name)
    tar.extractall()
    tar.close()
    os.chdir(file_name.replace('.tar.gz', ''))
    print(subprocess.check_output([sys.executable, 'virtualenv.py'] +
                                  [sys.argv[1]]).decode('utf-8'), end='')
    if len(sys.argv) > 2:
        print(subprocess.check_output([
            os.path.join(sys.argv[1], 'bin', 'pip'), 'install', 'virtualenv'] +

            sys.argv[2:]).decode('utf-8'), end='')
except:
    raise
finally:
    shutil.rmtree(tmp_dir)  # always clean up

и использовать его как

python_binary_to_use_in_venv /tmp/initvenv.py your_venv_name [optional packages]

например. (если вам действительно нужен уровень совместимости distribute для setuptools)

python /tmp/initvenv.py venv distribute

Обратите внимание, что с более старыми версиями python это может дать вам InsecurePlatformWarning s¹.

После того, как у вас есть ваш virtualenv (имя, например, venv), вы можете настроить другой virtualenv с помощью только что установленного virtualenv:

venv/bin/virtualenv venv2

virtualenvwrapper

Я рекомендую взглянуть на virtualenvwrapper, после однократной установки:

% /opt/python/2.7.10/bin/python /tmp/initvenv.py venv virtualenvwrapper

и активация (может быть выполнена из вашего логина script):

% source venv/bin/virtualenvwrapper.sh

вы можете делать такие вещи, как:

% mktmpenv 
New python executable in tmp-17bdc3054a46b2b/bin/python
Installing setuptools, pip, wheel...done.
This is a temporary environment. It will be deleted when you run 'deactivate'.
(tmp-17bdc3054a46b2b)% 

¹ Я не нашел способа подавить предупреждение. Его можно решить в pip и/или request, но разработчики указывают друг на друга в качестве причины. Я получил часто нереалистичную рекомендацию обновить версию python, которую я использовал до последней версии. Я уверен, что это сломается, например, мой Linux Mint 17. К счастью, pip кэширует пакеты, поэтому предупреждение сделано только один раз для установки пакета.

Ответ 12

У меня были различные проблемы (см. ниже) установку обновленных модулей SSL, даже внутри virtualenv, поверх старых версий Python, предоставляемых ОС, поэтому теперь я использую pyenv.

pyenv упрощает установку новых версий Python и поддерживает virtualenvs. Начало работы намного проще, чем рецепты для virtualenv, перечисленные в других ответах:

  • На Mac введите brew install pyenv и в Linux используйте pyenv-installer
  • это позволяет вам встроенную поддержку virtualenv, а также переключение версии Python (при необходимости).
  • хорошо работает с Python 2 или 3, может иметь сразу несколько версий.

Это отлично работает, чтобы изолировать "новую версию Python" и virtualenv от системы Python. Поскольку вы можете легко использовать более поздний Python (сообщение 2.7.9), модули SSL уже обновлены и, конечно, как и любая современная виртуальная система, вы изолированы от системных модулей Python.

Несколько хороших учебников:

Плагин pyenv-virtualenv теперь встроен в тип pyenv commands | grep virtualenv для проверки. Я бы не использовал плагин pyenv-virtualenvwrapper для начала - посмотрите, как вы переходите к pyenv-virtualenv, который более интегрирован в pyenv, так как это покрывает большую часть того, что делает virtualenvwrapper.

pyenv смоделирован на rbenv (хороший инструмент для переключения версии Ruby), и его единственная зависимость bash.

  • pyenv не имеет отношения к так называемому pyvenv, который является виртуальным эквивалентом той части последних версий Python 3 и не обрабатывает переключение версии Python

Предостережения

Два предупреждения о pyenv:

  • Он работает только из bash или аналогичной оболочки - или, более конкретно, плагин pyenv-virtualenv не похож на dash, который является /bin/sh на Ubuntu или Debian.
  • Он должен запускаться из интерактивной оболочки входа (например, bash --login с использованием терминала), чего не всегда легко достичь с помощью средств автоматизации таких как анзибль.

Следовательно, pyenv лучше всего подходит для интерактивного использования и менее хорош для серверов сценариев.

Проблемы с модулем SSL

Одна из причин использования pyenv заключается в том, что часто возникают проблемы с обновлением модулей Python SSL при использовании более старых системных версий Python:

Ответ 13

На официальном сайте Virtualenv есть хорошие инструкции. https://pypi.python.org/pypi/virtualenv

В основном, что я сделал, устанавливается pip с sudo easy_install pip, затем используется sudo pip install virtualenv, а затем создала среду с: virtualenv my_env (назовите ее так, как вы хотите), после чего я сделал: virtualenv --distribute my_env; который установил distribute и pip в моем virtualenv.

Снова следуйте инструкциям на странице virtualenv.

Вид хлопот, исходящий от Ruby; P

Ответ 14

Вот хороший способ установить virtualenvwrapper (обновление этого).

Загрузите virtualenv-1.11.4 (вы можете найти последнюю версию здесь), разархивируйте его, откройте terminal

# Create a bootstrapenv and activate it:
$ cd ~
$ python <path to unzipped folder>/virtualenv.py bootstrapenv
$ source bootstrapenv/bin/activate

# Install virtualenvwrapper:
$ pip install virtualenvwrapper
$ mkdir -p ~/bootstrapenv/Envs

# append it to file `.bashrc`
$ vi ~/.bashrc
  source ~/bootstrapenv/bin/activate
  export WORKON_HOME=~/bootstrapenv/Envs
  source ~/bootstrapenv/bin/virtualenvwrapper.sh

# run it now.
$ source ~/.bashrc

Вот и все, теперь вы можете использовать mkvirtualenv env1, lsvirtualenv..etc

Примечание: вы можете удалить virtualenv-1.11.4 и virtualenv-1.11.4.zip из папок загрузок.

Ответ 15

Хорошей новостью является то, что если вы установили python3.4, pyvenv уже установлен. Итак, Just

pyvenv project_dir
source project_dir/bin/activate
python --version   
python 3.4.*

Теперь в этом виртуальном env вы можете использовать pip для установки модулей для этого проекта.

Оставьте это виртуальное env, просто

deactivate