Pourquoi utiliser sys.chemin.ajouter (path) au lieu de sys.chemin.l'insert(1, chemin d'accès)?

Edit: basé sur une Ulf Rompe le commentaire, il est important que vous utilisez "1" au lieu de "0" , sinon vous allez casser sys.chemin .

je fais python depuis un certain temps maintenant (plus d'un an), et je suis toujours confus quant à la raison pour laquelle les gens vous recommandent d'utiliser sys.path.append() au lieu de sys.path.insert() . Laissez-moi vous montrer.

disons que je travaille sur un module nommé PyWorkbooks (qui est installé sur mon ordinateur), mais je travaille simultanément sur un module différent (disons PyJob) qui intègre PyWorkbooks. Comme je travaille sur PyJob je trouve des erreurs dans PyWorkbooks que je corrige, donc je voudrais importer une version de développement.

il y a plusieurs façons de travailler sur les deux (je pourrais mettre mon projet PyWorkbooks à L'intérieur de PyJob, par exemple), mais parfois je vais encore avoir besoin de jouer avec le chemin. Cependant, Je ne peux pas il suffit de faire un sys.path.append() au dossier où PyWorkbooks est à . Pourquoi? Parce que python va trouver mes PyWorkbooks installés en premier!

C'est pourquoi vous devez faire un sys.chemin.insert (1, path_to_dev_pyworkbooks)

en résumé:

sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one

ou:

sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file

cela a causé quelques blocages pour moi dans le passé, et je voudrais vraiment si nous (en tant que communauté) avons commencé à recommander sys.path.insert(1, path) , comme si vous insériez manuellement un chemin je pense qu'il est sûr de dire que c'est le chemin que vous voulez utiliser!

ou j'ai un problème? C'est une question qui me dérange parfois et je la voulais au grand jour!

77
demandé sur dreftymac 2012-04-10 23:19:12

3 réponses

si vous avez plusieurs versions d'un paquet / module, vous devez utiliser virtualenv (emphasis mine):

virtualenv est un outil pour créer des environnements Python isolés.

le problème de base à résoudre est celui des dépendances et des versions, et indirectement des permissions. Imaginez que vous avez une application qui nécessite la version 1 de LibFoo, mais une autre application nécessite la version 2. Comment utiliser ces deux applications? si vous installez tout dans /usr/lib/python2.7/site-packages (ou quel que soit l'emplacement standard de votre plateforme), il est facile de se retrouver dans une situation où vous mettez involontairement à niveau une application qui ne devrait pas être mise à niveau.

Ou, plus généralement, de ce que si vous souhaitez installer une application et laisser être ? Si une application fonctionne, tout changement dans les bibliothèques ou les versions de ces bibliothèques peuvent cassez l'application.

aussi, que se passe-t-il si vous ne pouvez pas installer les paquets dans le répertoire global site-packages ? Par exemple, sur un ordinateur hôte partagé.

Dans tous ces cas, virtualenv peut vous aider. Il crée un environnement qui possède ses propres répertoires d'installation, qui ne partage pas de bibliothèques avec d'autres environnements virtualenv (et n'accède pas non plus aux bibliothèques installées dans le monde entier).

C'est pourquoi les gens considèrent que insert(0, est une mauvaise solution -- c'est une solution incomplète et provisoire au problème de la gestion de plusieurs environnements.

42
répondu agf 2012-04-10 19:23:47

Si vous avez vraiment besoin d'utiliser sys.chemin.insérer, envisager de quitter sys.chemin[0] tel qu'il est:

sys.path.insert(1, path_to_dev_pyworkbooks)

cela pourrait être important puisque le code d'une tierce partie peut s'appuyer sur le système .chemin de la documentation de conformité:

Comme initialisé au démarrage du programme, le premier élément de cette liste, chemin[0], est le répertoire contenant le script qui a été utilisé pour invoquez l'interpréteur Python.

40
répondu Ulf Rompe 2012-04-10 22:47:18

vous confondez le concept d'ajout et de pré-ajout. le code suivant est en préparation:

sys.path.insert(1,'/thePathToYourFolder/')

il met les nouvelles informations au début (bien, ensuite, pour être précis) de la séquence de recherche que votre interprète. sys.path.append() remet les choses à la fin de la séquence de recherche.

il est conseillé d'utiliser quelque chose comme virtualenv au lieu de coder manuellement vos répertoires de paquets en le PYTHONPATH à chaque fois. pour configurer divers écosystèmes qui séparent vos paquets de sites et les versions possibles de python, lisez ces deux blogs:

  1. Python ecosystems introduction

  2. "1519190920 de" bootstrapping python environnements virtuels

si vous décidez de vous déplacer vers l'environnement isolement vous bénéficieriez certainement en regardant dans virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper /

12
répondu samkhan13 2013-10-21 17:45:13