240 votes

Faire en sorte que virtualenv hérite de paquets spécifiques de votre site-packages global

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

Pour être plus concret, j'essaie d'importer mon matplotlib dans virtualenv lors de la création de virtualenv. Elle ne peut pas être installée efficacement avec pip ou easy_install car il lui manque certaines librairies de compilateur fortran. La façon dont je l'ai fait jusqu'à présent était de copier manuellement depuis :

/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 yolk (qui affiche toutes les librairies actuellement disponibles dans le virtualenv).

Donc, y a-t-il un moyen de faire une variante sélective de la

virtualenv --system-site-packages

17 votes

Un petit rappel - veuillez sélectionner une réponse si l'une des options ci-dessous semble fonctionner.

0 votes

@foobarbecue Je suis l'OP original. Je n'ai actuellement plus l'environnement de test configuré, donc j'accepterai la réponse dès que je serai en mesure de tester les réponses.

2 votes

On dirait que 12 personnes ont testé pour vous au cours des derniers mois...

268voto

foobarbecue Points 1308

Créez l'environnement avec virtualenv --system-site-packages . Ensuite, activez le virtualenv et lorsque vous voulez que des choses soient installées dans le virtualenv plutôt que dans le python du système, utilisez pip install --ignore-installed o pip install -I . De cette façon, pip installera ce que vous avez demandé localement même si une version du système existe. Votre interpréteur python regardera d'abord dans le répertoire des paquets du virtualenv, donc ces paquets devraient remplacer les paquets globaux.

51 votes

En utilisant -I, vous réinstallerez toujours les paquets, même s'ils existent déjà dans le répertoire site-packages du système. Si vous utilisez -U à la place, il installera les nouvelles versions des paquets dans votre virtualenv, mais ne réinstallera pas les paquets qui sont déjà disponibles dans le système avec la version requise.

18 votes

Savez-vous s'il existe un moyen d'"activer" l'option --system-site-packages sur un environnement virtuel créé précédemment ? J'aimerais éviter de devoir réinstaller tous mes paquets locaux !

16 votes

19voto

schacki Points 2599

Vous pouvez utiliser le --system-site-packages et ensuite "surinstaller" le matériel spécifique pour votre virtualenv. De cette façon, tout ce que vous installez dans votre virtualenv sera pris à partir de là, sinon il sera pris à partir de votre système.

0 votes

Je ne sais pas exactement ce qui n'est pas clair, mais je vais essayer : si vous créez un virtualenv avec l'option --system-site-packages, le système va d'abord essayer de trouver des paquets dans votre virtualenv, s'il ne les trouve pas là, il va essayer de les trouver dans votre installation python système. S'il ne les trouve pas, il essaiera de les trouver dans l'installation python de votre système. S'il ne les trouve pas non plus, il lèvera une ImportError.

6 votes

Le seul problème de cette approche est que vous avez maintenant toutes les bibliothèques du système. Là où vous pourriez vouloir un contrôle très strict de ce qui est installé.

7 votes

Ce qui n'est pas clair, c'est comment cela est possible ! Si vous faites pip install myprog dans un virtualenv créé avec --system-site-packages où myprog existe dans le système, il ne va pas "surinstaller" myprog. Il va juste trouver que myprog existe, et dire "Exigence déjà satisfaite". Alors... que vouliez-vous dire ?

0voto

Stefan Points 1

Je suis en retard dans l'utilisation de python.3.8 et pip3 sur Ubuntu 20.04.

La SEULE façon de se débarrasser de l'installation .local ennuyeuse pour moi était de définir une variable d'environnement (bash) :

export PYTHONNOUSERSITE="true"

Il n'est pas nécessaire que ce soit "vrai", n'importe quoi peut fonctionner. Je n'opterais pas pour un 0. ;-)

-1voto

Lyndsy Simon Points 1648

Pourquoi ne pas simplement les vendoriser dans votre application, au lieu d'essayer de les regrouper avec le venv ? De cette façon, vous n'avez pas à suivre les changements sur l'ensemble de votre venv, mais seulement sur le module que vous devez conserver.

Voici un lien qui présente les avantages et les inconvénients de cette approche : Lien

-5voto

Eder Martins Points 5

Installer l'environnement virtuel avec

virtualenv --system-site-packages

et utiliser pip install -U to install matplotlib

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X