Почему "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/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)