85 votes

Pourquoi utiliser sys.path.append (path) au lieu de sys.path.insert (1, path)?

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 de la documentation

Je fais du python pour un bon moment maintenant (plus d'un an), et je suis toujours confus quant à pourquoi les gens vous recommandons d'utiliser le sys.chemin d'accès.ajouter au lieu de sys.chemin d'accès.insérer. Laissez-moi vous montrer.

Disons que je suis en train de travailler sur un module nommé PyWorkbooks (qui est installé sur mon ordinateur), mais je suis à la fois de travailler sur un autre module (disons PyJob) qui intègre PyWorkbooks. Comme je suis en train de travailler sur PyJob je trouve des erreurs dans PyWorkbooks que je suis en train de corriger, donc je voudrais importer une version de développement.

Il existe de multiples façons de travailler sur les deux (j'ai pu mettre mes PyWorkbooks projet à l'intérieur de PyJob, par exemple), mais parfois, j'ai encore besoin de jouer avec le chemin d'accès. Cependant, je ne peux pas tout simplement faire un sys.chemin d'accès.ajouter dans le dossier où PyWorkbooks est à. Pourquoi? Parce que python trouverez mes installé PyWorkbooks première!

C'est pourquoi vous devez faire un sys.chemin d'accès.l'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 décrochements pour moi dans le passé, et j'aimerais vraiment que si nous (en tant que communauté) ont commencé à recommander sys.chemin d'accès.l'insert(1, chemin), comme si vous y insérant manuellement un chemin d'accès, je pense qu'il est sûr de dire que c'est le chemin d'accès que vous souhaitez utiliser!

Ou dois-je quelque chose de mal? C'est une question qui est parfois me dérange et je voulais en plein!

47voto

agf Points 45052

Si vous avez plusieurs versions d'un paquet / module, vous devez être à l'aide de virtualenv (l'emphase est mienne):

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

Le problème abordé est l'une des dépendances et des versions, et indirectement les autorisations. Imaginez que vous avez une application qui a besoin de la version 1 de LibFoo, mais d'une autre application nécessite la version 2. Comment pouvez-vous utiliser ces applications? Si vous installez le tout dans /usr/lib/python2.7/site-packages (ou quel que soit votre plate-forme de l'emplacement standard de l'est), il est facile de se retrouver dans une situation où vous avez involontairement mise à niveau d'une application qui ne devrait pas être mis à niveau.

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

Aussi, si vous ne pouvez pas installer de paquets dans le global site-packages annuaire? Par exemple, sur un ordinateur hôte partagé.

Dans tous ces cas, virtualenv peut vous aider. Il crée un environnement qui a ses propres répertoires d'installation, qui ne partagent pas les bibliothèques avec d'autres virtualenv environnements (et éventuellement n'ont pas accès à l'échelle mondiale bibliothèques installées).

C'est pourquoi les gens considèrent insert(0, à être mal-c'est incomplète, le pis-aller de la solution au problème de la gestion des environnements multiples.

42voto

Ulf Rompe Points 356

Si vous avez vraiment besoin d'utiliser sys.path.insert, pensez à laisser sys.path [0] tel quel:

 sys.path.insert(1, path_to_dev_pyworkbooks)
 

Cela peut être important car le code tiers peut s’appuyer sur la conformité de la documentation sys.path :

Initialisé au démarrage du programme, le premier élément de cette liste, chemin [0], est le répertoire contenant le script utilisé pour appeler l'interpréteur Python.

13voto

samkhan13 Points 664

vous confondez le concept de l'ajout et ajoutant. le code suivant est ajoutant:

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

il place 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 recommandé que vous utilisez quelque chose comme virtualenv au lieu de saisir manuellement le codage de vos répertoires de paquets dans l' PYTHONPATH à chaque fois. pour la mise en place des différents écosystèmes qui les séparent de votre site-packages et les versions possibles de python, la lecture de ces deux blogs:

  1. python écosystèmes introduction

  2. l'amorçage python environnements virtuels

si vous décidez de descendre le chemin d'accès à l'isolement de l'environnement vous serait certainement bénéficier par la recherche dans les virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/

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