Заставьте virtualenv наследовать определенные пакеты от ваших глобальных site-пакетов

209

Я ищу способ сделать virtualenv, который будет содержать только некоторые библиотеки (которые я выбрал) из базовой установки Python.

Чтобы быть более конкретным, я пытаюсь импортировать мой matplotlib в virtualenv во время создания virtualenv. Он не может быть эффективно установлен с помощью pip или easy_install, поскольку он пропускает некоторые библиотеки компилятора Фортрана. То, как я делал это до сих пор, было вручную скопировать из

/usr/lib/python2.7/dist-packages/ to virtualenv_name/lib/python2.7/dist-packages/

однако это предотвращает регистрацию вручную импортированных ссылок с помощью желтка (который печатает все доступные в настоящее время библиотеки в virtualenv).

Итак, есть ли способ сделать выборочный вариант

virtualenv --system-site-packages
TheMeaningfulEngineer
источник
16
мягкое напоминание - выберите ответ, если один из приведенных ниже работает.
Барбекю
1
Похоже, что за последние несколько месяцев тебя проверили 12 человек ...
foobarbecue
2
Зачем приставать к ОП? Мы все можем видеть, какой ответ является самым популярным; действительно ли имеет значение, принимает ли он это? Я думаю, что его честность в тестировании для себя, вместо того, чтобы просто отметить самый популярный ответ, должна вызывать восхищение.
Майкл Шепер
5
2013: оценки между правильными и неправильными ответами очень похожи. ОП говорит, что он проверит. 2016: Майкл Шепер настолько впечатлен, что OP (три года назад) сказал, что проведет тестирование. 2017: Я снова сталкиваюсь с этим вопросом и удивлен.
Барбекю
2
Там нет правильного ответа. ОП попросил отборный --system-site-packages. Ответы предлагают использовать неселективный, --system-site-packagesа затем переустановить некоторые пакеты локально, что отличается и имеет различные последствия.
Петр Юркевич

Ответы:

239

Создать среду с virtualenv --system-site-packages. Затем активируйте virtualenv и, когда вы хотите, чтобы вещи были установлены в virtualenv, а не в системном python, используйте pip install --ignore-installedили pip install -I. Таким образом, pip установит то, что вы запросили локально, даже если существует общесистемная версия. Ваш интерпретатор python сначала будет искать в каталоге пакетов virtualenv, поэтому эти пакеты должны скрывать глобальные.

foobarbecue
источник
45
Используя -I, вы всегда будете переустанавливать пакеты, даже если они уже существуют в общесистемном каталоге site-packages. Если вместо этого вы используете -U, он установит более новые версии пакетов в ваш virtualenv, но не будет переустанавливать пакеты, которые уже доступны в системе с требуемой версией.
Данило Барген
15
Знаете ли вы, есть ли способ «активировать» опцию --system-site-packages в ранее созданной виртуальной среде? Я хотел бы избежать хлопот переустановки всех моих локальных пакетов!
Габриэль
15
Да, есть stackoverflow.com/questions/3371136/…
Марк
Я нашел этот ответ очень интересным, однако у меня был очень странный случай, когда он не работал. У меня есть virtualenv с no-global-site-packagesвключенным. Но по какой-то причине я не знаю, был ли пакет, который использовался из глобальной системы. Использование pip install -Iпакета изнутри virtualenv не сработало. В конце концов я временно удалил пакет как из virtualenv, так и из глобальной системы. Затем я смог установить его обратно в virtualenv и в систему (в таком порядке). Так что теперь все работает нормально.
kstenger
3
-1 Вопрос состоит в том, чтобы сделать видимыми определенные пакеты, а не все, кроме теневых пакетов. Белый список ограниченного набора будет намного безопаснее, чем белый список всего, потому что он позволяет гарантировать, что все пакеты должны существовать в venv, за исключением явно перечисленных в белом списке.
bluenote10
19

Вы можете использовать, --system-site-packagesа затем "переустановить" определенные вещи для вашего virtualenv. Таким образом, все, что вы устанавливаете в свой virtualenv, будет взято оттуда, в противном случае оно будет взято из вашей системы.

schacki
источник
Я не совсем уверен, что неясно, но постараюсь: если вы создадите virtualenv с опцией --system-site-packages, система сначала попытается найти пакеты в вашем virtualenv, если она не найдет их там, она будет попробуйте найти его в вашей системе установки Python. Только если он не найдет его там, он вызовет и ImportError.
Schacki
4
Единственная проблема с этим подходом состоит в том, что теперь у вас есть все системные библиотеки. Где вы могли бы хотеть очень жесткий контроль над тем, что установлено.
Дуэйн
7
Неясно, как это на самом деле возможно! Если вы выполните pip-установку myprog в virtualenv, созданном с помощью --system-site-packages, где myprog существует в системе, он не "переустановит" myprog. Он просто обнаружит, что myprog существует, и скажет «Требование уже выполнено». Итак ... что ты имел ввиду?
foo barbecue
-5

Установите виртуальную среду с

virtualenv --system-site-packages

и использовать pip install -U to install matplotlib

Эдер Мартинс
источник
3
Это противоположно тому, что задал вопрос.
Дэн Гетц
-7

Вы можете использовать virtualenv --clear. который не будет устанавливать какие-либо пакеты, а затем установить те, которые вы хотите.

Брэндон Пул
источник
Это не ответ на реальный вопрос о том, как использовать некоторые общесистемные пакеты
MrLeeh