Зробіть virtualenv успадковувати конкретні пакети зі свого глобального пакету сайту


208

Я шукаю спосіб зробити virtualenv, який буде містити лише деякі бібліотеки (які я вибрав) установки базового пітона.

Якщо бути конкретнішим, я намагаюся імпортувати свій matplotlib до virtualenv під час створення virtualenv. Вона не може бути ефективно встановлена ​​за допомогою pip або easy_install, оскільки вона не вистачає деяких файлів компілятора fortran. Як я це робив дотепер, це копіювати вручну з

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

однак це запобігає реєстрації мануально імпортних посилань жовток (який друкує всі наявні лібри в virtualenv).

Отже, чи є спосіб зробити вибірковий варіант

virtualenv --system-site-packages

16
ласкаве нагадування - виберіть відповідь, якщо, здається, працює одне із наведених нижче.
foobarbecue

1
схоже, що 12 людей протестували для вас протягом останніх кількох місяців ...
foobarbecue

2
Чому домагаються ОП? Всі ми можемо побачити, яка найпопулярніша відповідь; чи справді важливо, приймає він це? Я думаю, що його цілісність у тестуванні на собі, замість того, щоб просто тикати найпопулярнішу відповідь, слід захоплюватися.
Майкл Шепер

5
2013 рік: бали відповідей між правильними та неправильними відповідями досить схожі. ОП каже, що перевірить. 2016: Майкл Шепер настільки вражений, що ОП (три роки тому) сказав, що випробує. 2017: Я знову стикаюся з цим питанням і розважаюсь.
foobarbecue

2
Правильної відповіді немає. ОП просили вибірково --system-site-packages. Відповіді передбачають використання неселективного, --system-site-packagesа потім перевстановлення деяких пакетів локально, що відрізняється та має різні наслідки.
Пьотр Юркевич

Відповіді:


238

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


45
Використовуючи -I, ви завжди будете перевстановлювати пакети, навіть якщо вони вже існують у загальносистемному каталозі пакунків сайтів. Якщо ви використовуєте -U замість цього, він встановить новіші версії пакетів у ваш virtualenv, але не переустановить будь-які пакунки, які вже доступні в системі з потрібною версією.
Данило Барген

15
Чи знаєте ви, чи є якийсь спосіб "активувати" параметр - system-site-пакети у створеному раніше віртуальному середовищі? Я б хотів уникнути клопоту перевстановити всі мої локальні пакети!
Габріель


Я вважав цю відповідь дуже цікавою, проте у мене був дуже дивний випадок, коли вона не спрацювала. У мене virtualenv з no-global-site-packagesвключеним. Але мені чомусь невідомо, що був пакет, який використовували у світовій системі. Використання pip install -Iдля пакета зсередини virtualenv не працювало. Нарешті я временно видалив пакунок як з virtualenv, так і з глобальної системи. Потім я міг би встановити його назад у virtualenv та в систему (у такому порядку). Тож зараз це чудово працює.
kstenger

3
-1 Питання вимагає зробити певні пакети видимими, не всі, крім тіньових пакетів. Білий список обмеженого набору був би набагато безпечнішим, ніж все, що міститься у списках, тому що це дозволяє гарантувати, що всі пакунки повинні існувати у venv, за винятком явних білих списків.
bluenote10

19

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


Я не точно впевнений, що незрозуміло, але спробую: якщо ви створите virtualenv з опцією --system-site-пакети, система спочатку спробує знайти пакунки у вашому virtualenv, якщо він не знайде його там, він буде спробуйте знайти його в інсталяції системи python. Тільки якщо він і не знайде його там, він підніме і ImportError.
schacki

4
Єдина проблема такого підходу полягає в тому, що тепер у вас є всі системні бібліотеки. Там, де ви хочете дуже жорсткий контроль над тим, що встановлено.
Дуейн

7
Незрозуміло, як це насправді можливо! Якщо ви встановите pip, встановіть myprog у virtualenv, створеному з --system-site-пакетами, де myprog існує в системі, він не буде "перевстановлювати" мійprog. Він просто встановить, що мій прог існує, і скаже «Вимога вже задоволена». Отже ... що ти мав на увазі?
foobarbecue

-5

Встановити віртуальну програму ENV

virtualenv --system-site-packages

і використовувати pip install -U to install matplotlib


3
Це протилежне тому, що задавали питання.
Dan Getz

-7

Можна використовувати virtualenv --clear. який не встановить жодних пакетів, то встановіть потрібні.


Це не відповідь на власне питання про те, як скористатися деякими загальносистемними пакетами
MrLeeh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.