Edit: sur la base d'un commentaire d'Ulf Rompe, il est important d'utiliser "1" au lieu de "0" , sinon vous casserez sys.path .
Je fais du python depuis un certain temps maintenant (plus d'un an), et je ne comprends toujours pas pourquoi les gens vous recommandent de l'utiliser à la sys.path.append()
place de sys.path.insert()
. Laissez-moi vous démontrer.
Disons que je travaille sur un module nommé PyWorkbooks (qui est installé sur mon ordinateur), mais que je travaille simultanément sur un module différent (disons PyJob) qui intègre PyWorkbooks. Pendant que 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 devrai toujours jouer 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 un 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 blocages dans le passé, et j'aimerais vraiment que nous (en tant que communauté) commencions à recommander sys.path.insert(1, path)
, comme si vous insérez manuellement un chemin, je pense qu'il est prudent de dire que c'est le chemin que vous voulez utiliser!
Ou est-ce que j'ai quelque chose qui ne va pas? C'est une question qui me dérange parfois et je la voulais au grand jour!
la source
sys.path.insert(1, dev_folder)
mais il ne trouve toujours pas le module de développement, et n'utilise que le module installé. Comment puis-je réparer ça?Réponses:
Si vous avez plusieurs versions d'un package / module, vous devez utiliser virtualenv (c'est moi qui souligne):
C'est pourquoi les gens considèrent
insert(0,
qu'il se trompe - c'est une solution incomplète et provisoire au problème de la gestion de plusieurs environnements.la source
virtualenv
et je cherche en fait la réponse associée à l'OP)venv
.Si vous avez vraiment besoin d'utiliser sys.path.insert, pensez à laisser sys.path [0] tel quel:
Cela peut être important car le code tiers peut s'appuyer sur la conformité de la documentation sys.path :
la source
vous confondez le concept d'ajout et de préfixe. le code suivant est en préfixe:
il place les nouvelles informations au début (enfin, en second lieu, pour être précis) de la séquence de recherche que votre interprète va parcourir.
sys.path.append()
met 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 vos répertoires de paquets dans lePYTHONPATH
fichier à chaque fois. pour mettre en place divers écosystèmes qui séparent vos packages de site et les versions possibles de python, lisez ces deux blogs:introduction aux écosystèmes python
amorçage d'environnements virtuels python
si vous décidez de suivre la voie de l'isolation de l'environnement, vous bénéficierez certainement de la recherche dans virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/
la source