pipenv + pyenv + jupyter - PullRequest
       51

pipenv + pyenv + jupyter

0 голосов
/ 04 мая 2018

Я использую pyenv для установки и управления различными версиями python и виртуальными средами для различных проектов в моей системе. Но сейчас pipenv - рекомендуемый инструмент для управления виртуальными средами, и мне нравятся многие его возможности. По большей части все работает, но, похоже, в pipenv есть утечка или что-то вроде того, что касается ноутбука Jupyter. Вот шаги, которые повторяют проблему на моем компьютере.

  1. Установите pipenv, используя brew install pipenv.
  2. Установите новую версию Python, скажем, pyenv install 3.6.3, и активируйте ее с помощью pyenv global 3.6.3.
  3. Установите блокнот Jupyter и другой пакет, например, pip install jupyter requests.
  4. Создайте новый каталог и перейдите в него; создать проект pipenv, используя pipenv install
  5. Активируйте виртуальную среду pipenv, используя pipenv shell.
  6. Не устанавливайте никакие пакеты и убедитесь, что ни один из них не установлен в текущем virtualenv, используя pip list. (Я получаю только pip, setuptools и wheel.)
  7. Выполнить jupyter notebook. Мои ожидания: ошибки консоли jupyter: command not found. Фактически: сервер ноутбука и пользовательский интерфейс браузера запускаются как обычно.
  8. Создайте новый блокнот и импортируйте вспомогательный пакет, начиная с шага 3: import requests. Мое ожидание: ModuleNotFoundError брошен. Фактически: пакет импортирован и может использоваться как обычно.

Если я пытаюсь импортировать вспомогательный пакет в виртуальной среде pipenv, но за пределами записной книжки Jupyter (в repl или в скрипте Python), я получаю ModuleNotFoundError, как и ожидалось. Так что как-то проблема именно с Jupyter. Обратите внимание, что если я попытаюсь воссоздать эту проблему, используя виртуальную среду pyenv вместо виртуальной среды pipenv, то произойдет ожидаемое поведение: jupyter notebook приводит к ошибке jupyter: command not found в консоли.

У меня вопрос: использую ли я pipenv не по назначению, или есть альтернативный способ использования pipenv, позволяющий избежать этой проблемы?

Заранее спасибо!

1 Ответ

0 голосов
/ 05 мая 2018

Проблема

На шаге 1 вы устанавливаете pipenv вместе с напитком. Установка brew pipenv также устанавливает среду Python, которая используется напрямую. Сама команда находится на вашем пути, поэтому вы можете вызывать ее независимо от загруженной вами virtualenv.

На шаге 2 вы устанавливаете и загружаете pyenv virtualenv. Загрузка pyenv virtualenv меняет ваш путь. Когда вы используете pip сейчас, это pipv 3.6.3, и он будет установлен в этот pyenv. Поэтому, когда на шаге 3 вы запускаете pip install jupyter requests, они переходят в pyenv virtualenv.

Когда вы запустите pipenv, на шаге 4 он будет использовать свой собственный питон, чтобы он мог загрузить себя. Ваша загрузка pipenv virtualenv на шаге 5 затем добавляет папку bin для этого в ваш путь, позволяя вам запускать все, что вы устанавливаете. Это не отменяет изменения, сделанные pyenv. Когда вы запускаете pip на шаге 6, он запускается внутри этого pipenv virtualenv и печатает ограниченный список установленных пакетов.

На шаге 7 вы запускаете jupyter. Это не внутри pipenv virtualenv, а внутри pyenv. Дополнения пути pyenv все еще существуют, так что они работоспособны. Команда jupyter является bash-скриптом и выполняет магию для сброса пути python перед запуском Вот как он может найти модуль requests на шаге 8.

Вы наконец запустили какую-то форму Python Repl. Предположительно это находится в вашем pipenv virtualenv, поэтому загружает модули, которые находятся в этой среде.

Решение

Вам нужно выгрузить глобальный pyenv. Поскольку вы установили пакеты в вашу версию Python 3.6.3, я бы также удалил все установленные вами версии virtualenvs и python. Вы можете просто переустановить их.

Ваша установка pipenv в порядке, она может остаться. Это также основной инструмент, который вы должны использовать. Вам не нужно выполнять pip или pyenv напрямую.

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

...