Почему "python3 -m venv myenv" устанавливает в myenv более старую версию pip, чем любая другая версия pip, которую я могу найти в системе?

Это не вызывает у меня никаких проблем, которые я не могу решить путем активации виртуальной среды и запуска pip install -U pipНо мне всегда интересно, откуда взялась старая версия pip.

Я использую OS X 10.7.5. Когда я создаю виртуальную среду, используя либо pyvenv-3.4 myenv или же python3 -m venv myenvверсия pip, установленная в виртуальной среде, - 6.0.8, но я обновил свой глобальный pip до 6.1.1.

Вот терминальная сессия, демонстрирующая, что я имею в виду:

$ python3 -m venv myenv
$ myenv/bin/pip -V
pip 6.0.8 from /Users/dust/Desktop/myenv/lib/python3.4/site-packages (python 3.4)

Вот что я хотел бы, чтобы произошло:

$ source myenv/bin/activate
(myenv)$ pip -V
UPDATED SYSTEM VERSION HERE WOULD BE NICE

Я не могу найти пункт 6.0.8 нигде, кроме того, что создано в виртуальных средах.

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

$ which pip
/Library/Frameworks/Python.framework/Versions/3.4/bin/pip

$ which pip3
/Library/Frameworks/Python.framework/Versions/3.4/bin/pip3

$ pip -V
pip 6.1.1 from /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages (python 3.4)

$ pip3 -V
pip 6.1.1 from /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages (python 3.4)

Я даже пытался использовать find:

$ find / -type f -name pip 2>&1 | awk '! /^f.*$/'
/Library/Frameworks/Python.framework/Versions/3.4/bin/pip
/usr/local/bin/pip

$ find / -type f -name pip3 2>&1 | awk '! /^f.*$/'
/Library/Frameworks/Python.framework/Versions/3.4/bin/pip3

Я подумал, что /usr/local/bin/pip возможно, был виновником, но нет

$ /usr/local/bin/pip -V
pip 6.1.1 from /Library/Python/2.7/site-packages/pip-6.1.1-py2.7.egg (python 2.7)

Хм. Возможно, у OS X python есть это?

$ /usr/bin/python
>>> import pip
>>> pip.__version__
'6.1.1'

6.1.1 сообщается независимо от того, какой дистрибутив python я спрашиваю, будь то OS X 2.7.1, python.org 2.7.9 или python.org 3.4.3.

Возможно ли (или желательно) обновить версию pip, которая помещается в виртуальную среду?

2 ответа

Решение

Я сталкиваюсь с той же проблемой, работает OSX 10.10.2 а также python 3.4.2, Совсем недавно я создал виртуальную среду в debian wheezy машина с python 3.4.3 а также в конечном итоге с более старой версией pip чем доступно. пришлось обновить pip,

Я модернизировал pip в виртуальной среде для 6.1.1 от 6.0.8 вручную, потому что я согласен с версиями библиотеки программного обеспечения таким образом - и да, я обновляю свой python 3 версия для 3.4.3 прямо сейчас. Во всяком случае, моя система python3-pip это последняя версия 6.1.1поэтому я также удивился, почему pyvenv создает новую виртуальную среду и загружает ее со старым pip,

Я не заметил ничего плохого в виртуальных средах из-за обновления pip, (но, с другой стороны, я тоже не заметил ничего хорошего) Очевидно, что новый пипс быстрее - не заметил, и выдает меньше мусора при успешной установке, потому что пользователю все равно - также не заметил Возможно, потому что я один из тех, кому все равно, а также поставляется с самой современной кофемашиной, способной загружать латте-арт!!! - все еще жду sudo pip install latte заканчивать:(

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

Вы можете ссылаться на системные пакеты сайта, используя флаг --system-site-packages, когда создаете новую виртуальную среду, например

pyvenv myenv --system-site-packages

Это свяжет вашу общепринятую версию pip и удалит раздражение, которое вручную обновляет pip в каждой виртуальной среде, но если вы сделаете это, то будет ли ваша виртуальная среда такой виртуальной?

Обновление: после моей разглагольствования выше, я вошел в venv источник пакета, чтобы копать. pip устанавливается методом под названием _setup_pip в файле __init__.pyлиния 248

def _setup_pip(self, context):
        """Installs or upgrades pip in a virtual environment"""
        # We run ensurepip in isolated mode to avoid side effects from
        # environment vars, the current directory and anything else
        # intended for the global Python environment
        cmd = [context.env_exe, '-Im', 'ensurepip', '--upgrade',
                                                    '--default-pip']
        subprocess.check_output(cmd, stderr=subprocess.STDOUT)

Итак, venv, кажется, звонит ensurepip из оболочки с помощью subprocess модуль.

Еще одна минута гугл-фу дала мне это из документации по гарантии.

ensurepip.version ()

Возвращает строку, указывающую связанную версию pip, которая будет установлена ​​при начальной загрузке среды.

Итак, из командной строки следующий код:

$ python3 -c 'import ensurepip; print(ensurepip.version())' 
6.0.8

отображает мой текущий pip который будет загружен с ensurepip,

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

Новее

Если вы хотите "установить патч" на ваш установленный Python, просто измените версии, перечисленные в ensurepip/__init__.py и заменить два файла в ensurepip/_bundled, Вы можете найти это место, запустив find * | grep ensurepip из каталога, где установлен Python. На macOS с Homebrew это расположение: /usr/local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ensurepip

Вы также хотите удалить ensurepip/__pycache__ каталог, который содержит .pyc файлы.

Мое старое исправление во время сборки:

Вы можете обновить связанные версии pip и setuptools, исправив Python перед сборкой из исходного кода. Следующий патч обновит связанные версии pip и setuptools до текущей версии, доступной сегодня. Вы хотите призвать configure со следующей опцией: --with-ensurepip=upgrade

Те whl файлы загружаются из PYPI здесь:

https://pypi.org/project/pip/

https://pypi.org/project/setuptools/

diff -ru Python-3.7.1/Lib/ensurepip/__init__.py Python-3.7.1.new/Lib/ensurepip/__init__.py
--- Python-3.7.1/Lib/ensurepip/__init__.py  2018-10-20 06:04:19.000000000 +0000
+++ Python-3.7.1.new/Lib/ensurepip/__init__.py  2018-11-27 02:36:19.301655008 +0000
@@ -8,9 +8,9 @@
 __all__ = ["version", "bootstrap"]


-_SETUPTOOLS_VERSION = "39.0.1"
+_SETUPTOOLS_VERSION = "40.6.2"

-_PIP_VERSION = "10.0.1"
+_PIP_VERSION = "18.1"

 _PROJECTS = [
     ("setuptools", _SETUPTOOLS_VERSION),
Only in Python-3.7.1/Lib/ensurepip/_bundled: pip-10.0.1-py2.py3-none-any.whl
Only in Python-3.7.1.new/Lib/ensurepip/_bundled: pip-18.1-py2.py3-none-any.whl
Only in Python-3.7.1/Lib/ensurepip/_bundled: setuptools-39.0.1-py2.py3-none-any.whl
Only in Python-3.7.1.new/Lib/ensurepip/_bundled: setuptools-40.6.2-py2.py3-none-any.whl

Если вам повезет, вы можете поднять его с помощью патча Python.

Ваш Python устарел? Это используетmacports, но любой из brew, apt следует сделать.

port outdated

python36                       3.6.9 < 3.6.10

Давайте исправим это:

sudo port upgrade python36

А теперь... барабанная дробь, в моем недавно воссозданном venv, похоже, патч Python принес с собой последнюю версию pip.

pip --versionпоказывает 20.0.2, раньше было 18 и именно на это жаловался в venv.

Это после того, как я потратил смехотворно долгое время, пытаясь выяснить, как обновить мою версию pip для Python 3.6 на уровне пользователя на Mac, где, конечно, если вы выйдете из virtualenv, вы находитесь на Python 2.7, а где Python 3.6, установленный через macports, похоже, не имеет команды pip для работы, пока вы не соберете venv.

Глядя на /opt/local/Library/Frameworks/Python.framework/Versions/3.6, где macports помещает вещи, я подозреваю, что Уткнонос что-то понимает, так что +1.

На самом деле должно быть что-то более очевидное, например pip-system-selfupdate команда или pip36 что приходит вместе с python36. Особенно с учетом того, что поиск апгрейда пипса вернет кучу хитов по чему угодно, кроме этой темы.

Примечание: после моего обновления, хотя Python был обновлен

(venv)$ pwd

/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6

(venv)$ grep PIP_VERSION ensurepip/__init__.py
_PIP_VERSION = "18.1"

(venv) $python --version
Python 3.6.10

(venv) $pip --version
pip 20.0.2 from .../venv/lib/python3.6/site-packages/pip (python 3.6)

Другие вопросы по тегам