Как принудительно установить пакет в virtualenv?

Пытаясь установить django с другой версией, чем в системе, он показывает мне:

Installing collected packages: Django
Found existing installation: Django 1.7.11
Not uninstalling django at /home/user/lib/python2.7, outside environment /home/user/webapps/v2_dev/venv

Успешно установлен Django-1.8.19

Но на самом деле есть старая версия

пробовал разными командами:

./venv/bin/pip install Django==1.8.11

pip install Django==1.8.11

ОБНОВЛЕНО: когда я устанавливаю свои пакеты, он показывает:

The required version of setuptools (>=16.0) is not available,
and can't be installed while this script is running. Please
install a more recent version first, using
'easy_install -U setuptools'.
(Currently using setuptools 3.1 (/home/user/lib/python2.7/setuptools-3.1-py2.7.egg))

Когда я делаю обновление:

venv/bin/pip install --upgrade setuptools
Requirement already up-to-date: setuptools in ./venv/lib/python2.7/site-packages (40.5.0)

person petriichuk    schedule 31.10.2018    source источник
comment
добавить --upgrade в конце команды pip   -  person ruddra    schedule 31.10.2018
comment
нет, не работает. Показывает, что установлено, но «список пипсов» показывает, что нет   -  person petriichuk    schedule 31.10.2018
comment
удалите пакет и переустановите его с помощью pip и убедитесь, что вы удалили все папки, связанные с lib/site-packages....   -  person Lemayzeur    schedule 31.10.2018
comment
почему-то он использует setuptools из системы, а не из venv   -  person petriichuk    schedule 31.10.2018


Ответы (4)


Вместо того, чтобы устанавливать setuptools и Django, как ./venv/bin/pip install ..., попробуйте сначала активировать виртуальную среду, а затем установить то, что вам нужно.

Активация виртуальной среды:

Перейдите в папку, в которой находится ваша виртуальная среда (обычно это корневая папка вашего проекта), и введите один из двух:

  • source venv/bin/activate (Системы на базе Unix)
  • venv\Scripts\activate (Windows)

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

Принудительная переустановка пакетов:

  • Простое обновление можно сделать, добавив: --upgrade или -U
  • Принудительную переустановку пакетов можно выполнить, добавив: --force-reinstall

В вашем случае (после активации среды):

python -m pip install -U --force-reinstall setuptools Django

Шаг за шагом:

  1. Деактивировать и удалить старую виртуальную среду
  2. Создайте новую среду, используя python -m virtualenv venv (python 2) или python -m venv venv (python 3)

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

  3. source venv/bin/activate

    Активация виртуальной среды

  4. python -m pip install -U pip

    Если у вас есть проблема с ImportError: No module named _internal, то, вероятно, вы используете старую версию pip. Проблема описана здесь

  5. python -m pip install -U --force-reinstall -r requirements.txt

    -U --force-reinstall немного перебор в случае свежей среды, но не навредит

  6. Перейдите в место, где находится ваш manage.py, и запустите сервер с помощью python manage.py runserver.

person machnic    schedule 31.10.2018
comment
решается путем удаления одного пакета из моих требований.txt, но по-прежнему получается неправильная версия... когда я запускаю заморозку pip, он показывает 1.8.11, но когда я запускаю сервер запуска, он использует тот. Когда я пишу «какой питон», он показывает мой путь (venv/bin/python)… есть ли приоритет, какой пакет использовать?? - person petriichuk; 31.10.2018
comment
Он будет использовать пакеты из активной среды. Вы уверены, что перед запуском python manage.py runserver активировали среду, в которой установили новые версии setuptools и Django? (Имя активной среды отображается в скобках в начале каждой строки в терминале. Вы должны увидеть что-то вроде (venv) myName@myHost:/some/path$, прежде чем пытаться запустить сервер .) - person machnic; 31.10.2018
comment
конечно есть (venv), также пробовал venv/bin/python backend/manage.py runserver дает то же самое - person petriichuk; 31.10.2018
comment
Возможно, но пока вы выполняете все команды, такие как python -m ..., с активированной средой, системные пути не должны иметь большого значения. Однако возможно, что вы напортачили с пакетами сайтов внутри среды. Пробовали ли вы полностью удалить окружение, настроить новое и переустановить все пакеты с помощью requirements.txt? - person machnic; 31.10.2018
comment
только что попытался создать новый venv, venv/bin/python -m pip install -r config/requirements.txt показывает, что установлен, но venv/bin/python -m pip freeze показывает старый - person petriichuk; 31.10.2018
comment
так же после создания venv делаю venv/bin/easy_install pip, может проблема в нем? потому что без него я получаю ImportError: No module named _internal - person petriichuk; 31.10.2018
comment
Я добавил пошаговую часть к моему ответу. Старайтесь следовать ему в точности как есть, не добавляя при этом дополнительных шагов. Если это не поможет, предоставьте полный набор команд, которые вы использовали, и их вывод. - person machnic; 31.10.2018
comment
Итак, я выполнил все шаги, но то, что у меня есть, django берется из пользовательского каталога, а не из venv. когда я делаю python или venv/bin/python и >>> import django >>> django <module 'django' from '/home/user/lib/python2.7/django/__init__.pyc'> только venv/bin/pip freeze показывает мне, что я обновил версию Django... pip freeze показывает старую, а также python -m pip freeze и ./venv/bin/python -m pip freeze (venv активирован) - person petriichuk; 31.10.2018
comment
Давайте продолжим обсуждение в чате. - person machnic; 31.10.2018

Я пришел к этому сообщению, когда искал, как принудительно установить что-то в virtualenv, несмотря на то, что оно уже установлено в глобальном питоне. Это происходит, когда виртуальная среда была создана с помощью --system-site-packages.

В этой ситуации для некоторых пакетов может быть важно иметь локальную версию в virtualenv, даже если для многих других пакетов мы можем использовать глобальные версии. Это случай pytest, например. Однако pip откажется устанавливать пакет в virtualenv, если он уже может найти самую последнюю версию на системном сайте.

Решение состоит в том, чтобы использовать pip install --ignore-installed mypackage.

person Martino    schedule 16.06.2020
comment
Я считаю, что это должен быть правильный ответ. В вопросе конкретно указывается способ принудительной установки пакета в virtualenv, несмотря на его присутствие в глобальной папке пакетов системы. Следовательно, этот ответ дает правильное решение. Обновление пакетов, как предложено в других ответах, является неправильным вариантом, поскольку это может изменить указанную версию пакета в требованиях.txt. - person Teodoro; 14.03.2021

Проблема была в Webfaction VPS

Нужен пустой файл с именем sitecustomize.py в каталоге /home/username/webapps/appName/env/lib/python2.

Этот пустой файл переопределяет их настройки Python, одна из которых заключается в включении любых пакетов в каталог ~/lib/python2.7.

Возможно, вам придется деактивировать виртуальную среду и снова активировать ее, чтобы изменения вступили в силу.

person petriichuk    schedule 02.06.2019

обходной путь, но он работает!

в вашем каталоге virtualenv измените свойства файла pyvenv.cfg

include-system-site-packages = True

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

person Gilson Souza    schedule 03.07.2020