Я смущен насчет virtualenv
. Я читал документы и примерные примеры, но не улучшался.Как установить только с virtualenv?
Я создал virtualenv
следующим образом:
$ virtualenv myapp_venv --no-site-package
Я использовал --no-site-packages
, потому что я хочу знать, что мой requirements.txt
достаточно для сборки и запуска моего кода. Я не хочу зависеть от того, что может быть установлено на моей машине dev.
Затем я пытаюсь установить зависимости в мой virtualenv
:
$ source myapp_venv/bin/activate
(myapp_venv) $ sudo pip install -r requirements.txt
На данный момент я получаю множество сообщений, как это:
Requirement already satisfied (use --upgrade to upgrade): Flask==0.10.1 in /usr/local/lib/python2.7/dist-packages (from -r requirements.txt (line 1))
Это удивляет меня, как я думал virtualenv
не будет иметь дело с глобально доступными пакетами, но с окружающей средой этого проекта.
Когда я перехожу, чтобы попытаться запустить приложение:
(myapp_venv) $ python run.py
Traceback (most recent call last):
File "run.py", line 1, in <module>
from app import app
File "/home/eric/code/python/tournament/app/__init__.py", line 1, in <module>
from flask import Flask
ImportError: No module named flask
Но если я деактивировать virtualenv
, приложение работает просто отлично.
Как я могу установить pip
для установки пакетов в virtualenv
?
Для контекста я профессионально опытен Java/Maven. У меня немного языковой опыт на Python, но экосистема Python по-прежнему нова для меня.
Ничего себе, я никогда не знал, что «sudo» будет иметь такой эффект. Очень неожиданно. –
Когда вы используете sudo, вы действуете как root. Когда вы действуете как root pip, он будет установлен на глобальном уровне. Так как флешка уже установлена в вашей системе по всему миру, это даст вам это уже удовлетворенное требование. Но когда вы запускаете virtualenv локально без пакетов-сайтов, он не найдет его, поскольку этот параметр изолирует virtualenv от глобальных модулей. –