web-dev-qa-db-fra.com

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

Edit: basé sur le commentaire d'Ulf Rompe, il est important d'utiliser "1" au lieu de "0" , sinon vous casserez sys.path .

Je fais python depuis un certain temps maintenant (depuis un an), et je ne comprends toujours pas pourquoi les gens vous recommandent d'utiliser sys.path.append() au lieu de sys.path.insert(). Laissez-moi démontrer.

Supposons que je travaille sur un module nommé PyWorkbooks (installé sur mon ordinateur), mais que je travaille simultanément sur un module différent (par exemple, PyJob) intégrant PyWorkbooks. Pendant que je travaille sur PyJob, je trouve des erreurs que je corrige dans PyWorkbooks. Je souhaite donc importer une version de développement.

Il y a plusieurs façons de travailler sur les deux (je pourrais par exemple placer mon projet PyWorkbooks dans PyJob), mais il faudra parfois que je joue avec le chemin. Cependant, je ne peux pas simplement faire un sys.path.append() dans le dossier où se trouve PyWorkbooks . Pourquoi? Parce que python trouvera d’abord mes PyWorkbooks installés!

C'est pourquoi vous devez faire sys.path.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 m'a causé quelques interruptions dans le passé, et j'aimerais vraiment que nous (en tant que communauté) commencions à recommander sys.path.insert(1, path), comme si vous insériez manuellement un chemin, je pense qu'il est prudent de dire que c'est le chemin que vous voulez utiliser!

Ou est-ce que quelque chose ne va pas? C'est une question qui me dérange parfois et je le voulais à l'air libre!

80
Garrett Berg

Si vous avez plusieurs versions d'un paquet/module, vous devez utiliser virtualenv (emphase moi):

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

Le problème de base à résoudre est celui des dépendances et des versions, et indirectement des autorisations. Imaginez que vous ayez une application nécessitant la version 1 de LibFoo, mais qu'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 de votre plate-forme), il est facile de vous retrouver dans une situation où vous mettez involontairement à niveau une application qui ne devrait pas être mise à niveau.

Ou plus généralement, si vous voulez installer une application et que ce soit? Si une application fonctionne, toute modification de ses bibliothèques ou de leurs versions peut perturber l'application.

De plus, que se passe-t-il si vous ne pouvez pas installer de packages dans le site-packages répertoire? Par exemple, sur un 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’a pas non plus accès aux bibliothèques installées globalement).

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

44
agf

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 compter sur documentation sys.path conformité:

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ète Python.

41
Ulf Rompe

vous confondez le concept de l'ajout et de l'ajout en amont. le code suivant est en attente:

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

il place les nouvelles informations au début (bien, en second lieu pour être précis) de la séquence de recherche que votre interprète va parcourir. sys.path.append() place les choses à la toute fin de la séquence de recherche.

il est conseillé d'utiliser quelque chose comme virtualenv au lieu de coder manuellement les répertoires de votre paquet dans le PYTHONPATH à chaque fois. Pour configurer différents écosystèmes qui séparent vos packages de sites et les versions possibles de Python, lisez ces deux blogs:

  1. introduction des écosystèmes en python

  2. amorçage python

si vous décidez de vous engager sur la voie de l'isolation de l'environnement, vous bénéficierez certainement d'une analyse de virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/

13
samkhan13