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

169

Я ищу способ создания 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
похоже, что за последние несколько месяцев тебя проверили 12 человек ... foobarbecue
@ foobarbecue I 'm оригинальный OP. В настоящее время у меня больше не настроена среда тестирования, поэтому я приму ответ, как только смогу проверить ответы. TheMeaningfulEngineer
2013: оценки между правильными и неправильными ответами очень похожи. ОП говорит, что он проверит. 2016: Майкл Шепер настолько впечатлен, что OP (три года назад) сказал, что проведет тестирование. 2017: Я снова сталкиваюсь с этим вопросом и удивлен. foobarbecue
Зачем приставать к ОП? Мы все можем видеть, какой ответ является самым популярным; действительно ли имеет значение, принимает ли он это? Я думаю, что его честность в тестировании для себя, вместо того, чтобы просто отметить самый популярный ответ, должна вызывать восхищение. Michael Scheper
мягкое напоминание - выберите ответ, если один из приведенных ниже работает. foobarbecue

Ваш Ответ

4   ответа
-7

virtualenv --clear, которые не установят какие-либо пакеты, затем установите те, которые вы хотите.

Это не ответ на вопрос о том, как использовать некоторые общесистемные пакеты.
202

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

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

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

virtualenv --system-site-packages

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

Это противоположно тому, что задал вопрос.
15

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

Неясно, насколько это возможно на самом деле! Если вы выполните pip-установку myprog в virtualenv, созданном с помощью --system-site-packages, где myprog существует в системе, он не будет переустановлен & quot; MyProg. Он просто обнаружит, что myprog существует, и скажет «Требование уже выполнено». Итак ... что ты имел в виду?
schacki. Вы не могли бы объяснить
Я не совсем уверен, что неясно, но постараюсь: если вы создадите virtualenv с опцией --system-site-packages, система сначала попытается найти пакеты в вашем virtualenv, если она не найдет их там, она будет попробуйте найти его в вашей системе установки Python. Только если он не найдет его там, он вызовет и ImportError.
Единственная проблема с этим подходом состоит в том, что теперь у вас есть все системные библиотеки. Где вы могли бы хотеть очень жесткий контроль над тем, что установлено.

Похожие вопросы