Как правильно установить pip, virtualenv и распространять для Python? - PullRequest
243 голосов
/ 01 декабря 2010

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

Фон

В моем ответе на ТАК вопрос 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? . Мне нравится идея сохранения чистой глобальной директории site-packages, поэтому единственные другие пакеты, которые я устанавливаю, это 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

Упрек Глифа

В комментарии к мой ответ на ТАК вопрос 4314376 , ТАК пользователь Символ указано:

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

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

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

Ответы [ 15 ]

2 голосов
/ 07 июня 2015
  • Вы можете сделать это, не устанавливая ничего в сам Python.

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

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

  • Вам не нужно редактировать информацию о версии в bash-скрипте, чтобы поддерживать работуна сегодняшний день.

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

  • это работает для 2.7, а также для 3.X

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

из future импортируйте 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
    tar_found = False
    url = None
    sha256 = None
    for line in f.read().splitlines():
        if isinstance(line, bytes):
            line = line.decode('utf-8')
        if tar_found:
            if 'sha256' in line:
                sha256 = line.split('data-clipboard-text')[1].split('"')[1]
                break
            continue
        if not tar_found and 'tar.gz">' not in line:
            continue
        tar_found = True
        for url in line.split('"'):
            if url.startswith('https'):
                break
    else:
        print('tar.gz not found')
        sys.exit(1)
    file_name = url.rsplit('/', 1)[1]
    print(file_name)
    os.chdir(tmp_dir)
    data = urlopen(url).read()
    data_sha256 = hashlib.sha256(data).hexdigest()
    if sha256 != data_sha256:
        print('sha256 not correct')
        print(sha256)
        print(data_sha256)
        sys.exit(1)
    with open(file_name, 'wb') as fp:
        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

и активации (можно сделать из сценария входа в систему):

% 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 кэширует пакеты, поэтому предупреждение делается только один раз за установку пакета.

2 голосов
/ 10 октября 2011

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

0 голосов
/ 26 июня 2015

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

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

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

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

deactivate
0 голосов
/ 03 апреля 2014

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

Загрузить 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 из папок загрузок.

0 голосов
/ 25 апреля 2013

На официальном сайте 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.

Вид хлопот, происходящих от Руби; P

...