Spraw, aby virtualenv dziedziczył określone pakiety z globalnych pakietów witryn


208

Szukam sposobu na utworzenie virtualenv, który będzie zawierał tylko niektóre biblioteki (które wybrałem) podstawowej instalacji Pythona.

Aby być bardziej konkretnym, próbuję zaimportować mój matplotlib do virtualenv podczas tworzenia virtualenv. Nie można go skutecznie zainstalować za pomocą pipa lub easy_install, ponieważ brakuje niektórych bibliotek kompilatora fortran. Do tej pory robiłem to ręcznie

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

zapobiega to jednak rejestrowaniu ręcznie importowanych linków przez żółtko (które drukuje wszystkie aktualnie dostępne biblioteki lib w virtualenv).

Czy istnieje sposób na wybranie wariantu

virtualenv --system-site-packages

16
delikatne przypomnienie - wybierz odpowiedź, jeśli jedno z poniższych wydaje się działać.
foobarbecue

1
wygląda na to, że w ciągu ostatnich kilku miesięcy przetestowało cię 12 osób ...
foobarbecue

2
Po co męczyć PO? Wszyscy możemy zobaczyć, która jest najbardziej popularną odpowiedzią; czy to naprawdę ważne, czy to akceptuje? Myślę, że należy podziwiać jego uczciwość w testowaniu dla siebie, zamiast po prostu zaznaczać najpopularniejszą odpowiedź.
Michael Scheper

5
2013: Wyniki odpowiedzi między poprawnymi a niepoprawnymi odpowiedziami są dość podobne. OP mówi, że przetestuje. 2016: Michael Scheper jest pod takim wrażeniem, że OP (trzy lata temu) powiedział, że przetestuje. 2017: Ponownie napotykam to pytanie i jestem rozbawiony.
foobarbecue

2
Nie ma poprawnej odpowiedzi. OP poprosił o wybiórcze --system-site-packages. Odpowiedzi sugerują użycie nieselektywnego, --system-site-packagesa następnie lokalną deinstalację niektórych pakietów, co jest inne i ma różne implikacje.
Piotr Jurkiewicz

Odpowiedzi:


238

Utwórz środowisko za pomocą virtualenv --system-site-packages. Następnie aktywuj virtualenv, a jeśli chcesz zainstalować rzeczy w virtualenv zamiast w Pythonie systemowym, użyj pip install --ignore-installedlub pip install -I. W ten sposób pip zainstaluje to, o co prosiłeś lokalnie, nawet jeśli istnieje wersja ogólnosystemowa. Twój interpreter Pythona będzie najpierw szukał w katalogu pakietów virtualenv, więc pakiety te powinny śledzić globalne.


45
Korzystając z opcji -I, zawsze będziesz ponownie instalować pakiety, nawet jeśli już istnieją w ogólnosystemowym katalogu pakietów stron. Jeśli użyjesz zamiast tego opcji -U, zainstaluje ona nowsze wersje pakietów na twoim virtualenv, ale nie przeinstaluje żadnych pakietów, które są już dostępne w systemie z wymaganą wersją.
Danilo Bargen

15
Czy wiesz, czy istnieje jakiś sposób na „aktywację” opcji --system-site-packages we wcześniej utworzonym środowisku wirtualnym? Chciałbym uniknąć kłopotów z ponowną instalacją wszystkich moich lokalnych pakietów!
Gabriel


Uznałem tę odpowiedź za bardzo interesującą, ale miałem bardzo dziwny przypadek, w którym nie zadziałała. Mam virtualenv z no-global-site-packageswłączonym. Ale z jakiegoś powodu nie wiem, czy był używany pakiet z globalnego systemu. Korzystanie pip install -Iz pakietu z poziomu virtualenv nie działało. W końcu zakończyłem tymczasowe odinstalowanie pakietu zarówno z systemu virtualenv, jak i globalnego, a następnie mogłem zainstalować go ponownie w virtualenv i systemie (w tej kolejności). Więc teraz działa dobrze.
kstenger

3
-1 Pytanie dotyczy tego, aby niektóre pakiety były widoczne, nie wszystkie oprócz pakietów zacieniowanych. Dodanie do ograniczonego zestawu białej listy byłoby znacznie bezpieczniejsze niż dodanie do białej listy wszystkiego, ponieważ pozwala zagwarantować, że wszystkie pakiety muszą istnieć w venv, z wyjątkiem tych z białą listą.
bluenote10,

19

Możesz użyć, --system-site-packagesa następnie „przeinstalować” określone rzeczy dla swojego virtualenv. W ten sposób wszystko, co zainstalujesz w virtualenv, zostanie stamtąd pobrane, w przeciwnym razie zostanie pobrane z twojego systemu.


Nie jestem do końca pewien, co jest niejasne, ale spróbuję: jeśli utworzysz virtualenv z opcją --system-site-packages, system najpierw spróbuje znaleźć pakiety w twoim virtualenv, jeśli go tam nie znajdzie, będzie spróbuj znaleźć go w systemie Python. Tylko jeśli go tam też nie znajdzie, podniesie i zaimportuje błąd.
schacki

4
Jedynym problemem związanym z tym podejściem jest to, że masz teraz wszystkie biblioteki systemowe. Gdzie możesz chcieć bardzo ścisłej kontroli nad tym, co jest zainstalowane.
Dwayne

7
Niejasne jest, w jaki sposób jest to faktycznie możliwe! Jeśli wykonasz pip, zainstaluj myprog w virtualenv utworzonym z --system-site-packages, w którym myprog istnieje w systemie, to nie „przeinstaluje” myproga. Po prostu stwierdzi, że myprog istnieje i powie „Wymagania już spełnione”. Więc ... co miałeś na myśli?
foobarbecue

-5

Zainstaluj wirtualną env za pomocą

virtualenv --system-site-packages

I użyć pip install -U to install matplotlib


3
Jest to przeciwieństwo pytania.
Dan Getz

-7

Możesz użyć virtualenv --clear. który nie zainstaluje żadnych pakietów, a następnie zainstaluj te, które chcesz.


To nie jest odpowiedź na pytanie, jak korzystać z niektórych pakietów
systemowych
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.