Ubuntu + virtualenv = un gâchis? virtualenv déteste les paquets dist, veut des paquets site

StackOverflow https://stackoverflow.com/questions/1215610

Question

Quelqu'un peut-il m'expliquer s'il vous plaît ce qui se passe avec python dans Ubuntu 9.04?

J'essaie de faire tourner virtualenv et l'indicateur - no-site-packages ne semble rien faire avec ubuntu. J'ai installé virtualenv 1.3.3 avec easy_install (que j'ai mis à niveau vers setuptools 0.6c9 ) et tout semble être installé sur . /usr/local/lib/python2.6/dist-packages

Je suppose que, lors de l'installation d'un paquet utilisant apt-get, il est placé dans /usr/lib/python2.6/dist-packages / ?

Le problème est qu’il existe également un /usr/local/lib/python2.6/site-packages qui reste vide. Il semblerait (en regardant le chemin dans un virtualenv ) qu'il s'agisse du dossier que virtualenv utilise comme sauvegarde. Ainsi, même si j’ai omis d’exclure - no-site-packages , je ne peux pas accéder aux packages de mes systèmes locaux à partir de n’importe lequel de mes virtualenv.

Mes questions sont donc les suivantes:

  1. Comment faire en sorte que virtualenv pointe sur l'un des packages-dist ?
  2. À quels packages distants dois-je le signaler? /usr/lib/python2.6/dist-packages ou /usr/local/lib/python2.6/dist-packages /
  3. Quel est le point de /usr/lib/python2.6/site-packages ? Il n'y a rien dedans!
  4. Est-ce que c'est le premier arrivé, premier servi sur le chemin? Si une version plus récente du paquet XYZ est installée dans /usr/local/lib/python2.6/dist-packages / et une version antérieure (d'ubuntu repos / apt-get) dans /usr/lib/python2.6/dist-packages , lequel est importé lorsque je importe xyz ? Je suppose que cela est basé sur la liste des chemins, oui?
  5. Pourquoi diable est-ce si déroutant? Y a-t-il quelque chose qui me manque ici?
  6. Où est-il défini que easy_install doit être installé dans /usr/local/lib/python2.6/dist-packages ?
  7. Cela affectera-t-il également pip ?

Merci à tous ceux qui peuvent résoudre ce problème!

Était-ce utile?

La solution

Je serais tenté de le pirater en faisant en sorte que site-packages soit un lien vers dist-packages, mais je suppose que cela pourrait affecter d'autres cas dans lesquels vous souhaitez installer une extension autre que celle d'ubuntu. Je ne peux pas penser à une autre réponse à 1, sauf à modifier les sources de virtualenv (ubuntu et virtualenv étant si populaires que je ne serais pas surpris de voir que des versions modifiées existent déjà).

Re 2, si vous utilisez / usr / local / bin / python, vous devez utiliser la version / usr / local de la lib (y compris les paquet-site) et inversement si vous utilisez / usr / bin / python .

Re 3, il y aura quelque chose là-bas si vous installez une extension pour / usr / bin / python à partir de sources (pas via easy_install ou de la distribution d'Ubuntu).

En ce qui concerne 4, oui, les entrées précédentes sur le chemin sont prioritaires.

Re 5, easy_install n’est facile à utiliser que par son nom - il fait tellement de magie noire qu’il a été soigneusement gardé hors de la bibliothèque standard de Python, malgré sa commodité, car le consensus parmi nous, python committers, est que la magie noire profonde pour plus de commodité est " facile " seulement en surface.

Re 6, je pense qu’il s’agit d’une modification ubuntu d’easy_install - si c’est vrai, elle est définie chaque fois que Canonical ou d’autres mainteneurs d’Ubuntu prennent leurs décisions collectives.

Re 7, désolé, aucune idée - je n’ai pas d’ubuntu raisonnablement récent sous la main pour vérifier.

Autres conseils

Je crois que la réponse de Mike Orr tirée de la liste de diffusion virtual-env semble être la meilleure. Notez que le PO a publié cette question aux deux endroits.

Contenu d'origine du courrier:

Debian a créé le répertoire / usr / local / lib / pythonVERSION / site-packages, et compilé le binaire Python pour l'inclure dans la recherche par défaut chemin. Ubuntu a suivi Debian comme à son habitude. Le python les développeurs n'aimaient pas cela parce que vous auriez des interférences avec un / usr / local / bin / python installé localement en utilisant les mêmes packages de site annuaire. Ubuntu a finalement décidé d'abandonner les paquets de site et d'utiliser dist-packages à la place, un nom qu'ils ont inventé pour qu'il ne soit pas interférer avec n'importe quoi. L'histoire de loing est quelque part si vous google, quelque part dans le traqueur de bogues Python ou distutils SIG ou tel.

Le système fonctionne, du moins si vous utilisez le paquet Ubuntu virtualenv. Certaines personnes ont eu des problèmes d’utilisation d’un virtualenv installé localement sur Ubuntu parce que les entrées magiques de sys.path n’ont pas été ajoutées ou quelque chose. Je ne suis pas sûr de --no-site-packages car je n'utilise jamais cette option: je lance PIL et mysqldb à partir des paquets Ubuntu car il peut être difficile de compiler leurs dépendances C parfois. (Besoin du fichiers d’en-tête de droite, Python ignore les fichiers d’en-tête, etc.)

Donc, les paquets Ubuntu Python vont dans / usr / lib / pythonVERSION / dist-packages. Ou ce support python répertoire pour une raison quelconque. Les packages Python installés localement entrent dans / usr / local / lib / pythonVERSION / dist-packages par défaut. Chaque fois que je installer un système Ubuntu 9.04 que je lance:

$ sudo apt-get install python-setuptools (6.0c9) $ sudo apt-get install python-virtualenv (1.3.3) $ sudo easy_install pip $ sudo pip installer virtualenvwrapper

Les virtualenvs fonctionnent bien de cette façon, bien que je n’aie pas essayé --no-site-packages.

  

J'essaie de faire tourner virtualenv, et l'indicateur --no-site-packages   semble ne rien faire avec Ubuntu. J'ai installé virtualenv 1.3.3 avec   easy_install (que j'ai mis à niveau vers setuptools 0.6c9)

Ces versions sont toutes les deux dans Ubuntu 9.04, vous allez donc rendre la tâche plus difficile. vous-même en les installant localement.

  

et tout   semble être installé sur /usr/local/lib/python2.6/dist-packages

Oui

  

Je suppose que lors de l'installation d'un paquet utilisant apt-get, il est placé dans /   usr / lib / python2.6 / dist-packages /?

Oui

  
      
  1. Est-ce que c'est le premier arrivé, premier servi sur le chemin? Si j'ai un nouveau   version du paquet XYZ installée dans /usr/local/lib/python2.6/dist-   packages / and et old one (de ubuntu repos / apt-get) dans / usr / lib /   python2.6 / dist-packages, lequel est importé lorsque j'importe xyz?   Je suppose que cela est basé sur la liste des chemins, oui?
  2.   

sys.path est analysé dans l'ordre. La seule chose amusante est que les œufs .pth être mis plus tôt ou plus tard dans le chemin que certaines personnes s’attendent. Mais si vous utilisez pip pour tout ce qu'il peut faire (c'est-à-dire sauf pour installer pip lui-même, des œufs précompilés et un instantané d’un répertoire local qui est un copie plutôt qu’un lien d’oeuf), vous n’auriez pas beaucoup d’œufs .pth de toute façon.

  
      
  1. Pourquoi diable est-ce si déroutant? Y a-t-il quelque chose que je suis   manquant ici?
  2.   

Ce n'est pas bien documenté. Je l'ai compris en scannant le Web.

  
      
  1. Est-ce que cela affectera aussi pip?
  2.   

Oui, pip s’installera automatiquement sur / usr / local / lib / pythonVERSION / site-packages. Utilisez " pip install -E $ VIRTUAL_ENV packagename " installer dans un virtualenv.

Vous ne devriez vraiment pas toucher à l'installation Python d'Ubuntu à moins de créer des outils d'administration système ou de créer quelque chose qui pourrait être considéré comme un nouveau service système.

Si vous utilisez Ubuntu pour développer ou déployer des applications Python, construisez toujours votre propre Python à partir de la source, tarifiez-le et utilisez-le pour le déploiement. De cette façon, vous aurez tous les répertoires au bon endroit et virtualenv fonctionnera normalement. Si vous souhaitez déployer plusieurs applications Python sur le serveur, faites vivre votre Python dans un emplacement tel que / home / python ou / opt / python ou quelque part en dehors de votre répertoire personnel. . Assurez-vous de disposer des autorisations en écriture pour le groupe de développeurs ( utilisateurs ?) Afin que les utilisateurs puissent facilement ajouter des packages.

Cela vous permet également d’avoir deux niveaux de packages. Ceux qui sont vos outils internes standard peuvent être installés dans votre distribution Python et faire partie de l'archive que vous déployez, et seuls les packages spécifiques à une application seraient dans un virtualenv.

Ne mettez pas à niveau ou modifiez le système Ubuntu installé Python.

Eh bien, j’ai une Ubuntu 9.04 et j’ai rapidement essayé de configurer deux sandbox avec des paquets de site et une sans. Et les choses fonctionnent bien.

La seule différence dans l’approche que j’ai adoptée est que j’ai utilisé le paquet python-virtualenv d’Ubuntu (1.3.3). Et présumez que l'équipe Ubuntu a mis au point une configuration adaptée aux configurations Ubuntu.

Pour résumer, désactivez virtualenv avec easy_installed pendant un certain temps, utilisez le package python-virtualenv et voyez si cela répond à vos attentes.

En fait, nous utilisons une configuration similaire pour la production sans aucun problème. Alex a déjà répondu au reste.

Une autre façon de résoudre ce problème:
https://stackoverflow.com/a/17265840/202168

N'oubliez pas de le faire dans chaque virtualenv où vous en avez besoin, mais ne comptez pas sur des hacks ou sur une version spéciale de virtualenv

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top