Faites en sorte que virtualenv hérite de packages spécifiques de vos packages de site globaux

209

Je cherche un moyen de faire un virtualenv qui contiendra juste quelques bibliothèques (que j'ai choisies) de l'installation de base de python.

Pour être plus concret, j'essaie d'importer mon matplotlib vers virtualenv lors de la création de virtualenv. Il ne peut pas être installé efficacement avec pip ou easy_install car il manque certaines bibliothèques du compilateur fortran. La façon dont je l'ai fait jusqu'à présent était de copier manuellement à partir de

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

cependant, cela empêche les liens importés manuellement d'être enregistrés par le jaune (qui imprime toutes les bibliothèques actuellement disponibles dans virtualenv).

Alors, existe-t-il un moyen de faire une variante sélective de la

virtualenv --system-site-packages
TheMeaningfulEngineer
la source
16
un petit rappel - veuillez sélectionner une réponse si l'un des éléments ci-dessous semble fonctionner.
foobar barbecue
1
on dirait que 12 personnes ont testé pour vous ces derniers mois ...
foobar barbecue
2
Pourquoi harceler l'OP? Nous pouvons tous voir quelle est la réponse la plus populaire; est-ce vraiment important qu'il l'accepte? Je pense que son intégrité dans les tests par lui-même, au lieu de simplement cocher la réponse la plus populaire, devrait être admirée.
Michael Scheper
5
2013: Les scores des réponses entre les réponses correctes et incorrectes sont assez similaires. OP dit qu'il va tester. 2016: Michael Scheper est tellement impressionné que OP (il y a trois ans) a déclaré qu'il testerait. 2017: je retrouve cette question et je m'amuse.
foobar barbecue le
2
Il n'y a pas de bonne réponse. OP a demandé sélectif --system-site-packages. Answers suggère d'utiliser non sélectif --system-site-packagespuis de surinstaller certains packages localement, ce qui est différent et a des implications différentes.
Piotr Jurkiewicz

Réponses:

239

Créez l'environnement avec virtualenv --system-site-packages. Ensuite, activez le virtualenv et quand vous voulez que les choses soient installées dans le virtualenv plutôt que le système python, utilisez pip install --ignore-installedou pip install -I. De cette façon, pip installera ce que vous avez demandé localement même s'il existe une version à l'échelle du système. Votre interpréteur python apparaîtra en premier dans le répertoire des packages de virtualenv, ces packages doivent donc occulter les packages globaux.

barbecue
la source
45
En utilisant -I, vous réinstallerez toujours les packages, même s'ils existent déjà dans le répertoire des packages de site à l'échelle du système. Si vous utilisez -U à la place, il installera des versions plus récentes des packages dans votre virtualenv, mais ne réinstallera aucun package déjà disponible dans le système avec la version requise.
Danilo Bargen
15
Savez-vous s'il existe un moyen d'activer l'option --system-site-packages dans un environnement virtuel créé précédemment? J'adorerais éviter les tracas de réinstaller tous mes packages locaux!
Gabriel
J'ai trouvé cette réponse très intéressante, mais j'ai eu un cas très étrange où cela n'a pas fonctionné. J'ai un virtualenv avec no-global-site-packagesactivé. Mais pour une raison quelconque, je ne sais pas s'il y avait un paquet utilisé par le système mondial. L'utilisation pip install -Idu package depuis l'intérieur de virtualenv n'a pas fonctionné. J'ai finalement fini par désinstaller temporairement le paquet du virtualenv et du système global, puis j'ai pu le réinstaller dans le virtualenv et dans le système (dans cet ordre). Alors maintenant, ça fonctionne bien.
kstenger
3
-1 La question demande de rendre certains paquets visibles, pas tous sauf pour les paquets masqués. La liste blanche d'un ensemble limité serait beaucoup plus sûre que la liste blanche, car elle permet de garantir que tous les packages doivent exister dans le venv, à l'exception de ceux explicitement sur la liste blanche.
bluenote10
19

Vous pouvez utiliser le --system-site-packagespuis "surinstaller" les trucs spécifiques pour votre virtualenv. De cette façon, tout ce que vous installerez dans votre virtualenv sera pris à partir de là, sinon il sera pris à partir de votre système.

schacki
la source
Je ne sais pas exactement ce qui n'est pas clair, mais j'essaierai: si vous créez un virtualenv avec l'option --system-site-packages, le système essaiera d'abord de trouver des packages dans votre virtualenv, s'il ne le trouve pas là, il le fera essayez de le trouver dans l'installation de votre système python. Seulement s'il ne le trouve pas non plus, il lève et ImportError.
schacki
4
Le seul problème avec cette approche est que vous avez maintenant toutes les bibliothèques système. Où vous voudrez peut-être un contrôle très strict de ce qui est installé.
Dwayne
7
Ce qui n'est pas clair, c'est comment cela est possible! Si vous installez pip myprog dans un virtualenv créé avec --system-site-packages où myprog existe dans le système, il ne "surinstallera" pas myprog. Il trouvera simplement que myprog existe et dira "Exigence déjà satisfaite". Alors ... que vouliez-vous dire?
foobar barbecue
-5

Installez virtual env avec

virtualenv --system-site-packages

et utilise pip install -U to install matplotlib

Eder Martins
la source
3
C'est l'opposé de la question posée.
Dan Getz
-7

Vous pouvez utiliser virtualenv --clear. qui n'installera aucun paquet, puis installez ceux que vous voulez.

Brandon Poole
la source
Ce n'est pas une réponse à la question réelle sur la façon d'utiliser certains packages à l'échelle du système
MrLeeh