ajout d'un répertoire à sys.path / PYTHONPATH


130

J'essaye d'importer un module à partir d'un répertoire particulier.

Le problème est que si sys.path.append(mod_directory)j'ajoute le chemin, puis que j'ouvre l'interpréteur python, le répertoire mod_directoryest ajouté à la fin de la liste sys.path. Si j'exporte la PYTHONPATHvariable avant d'ouvrir l'interpréteur python, le répertoire est ajouté au début de la liste. Dans ce dernier cas, je peux importer le module mais dans le premier, je ne peux pas.

Quelqu'un peut-il expliquer pourquoi cela se produit et me donner une solution pour ajouter le mod_directoryau début, dans un script python?


J'ai essayé le sitemodule .
Zeinab Abbasimazar

Réponses:


178

Cela fonctionne comme documenté. Tous les chemins spécifiés dans PYTHONPATHsont documentés comme venant normalement après le répertoire de travail mais avant les chemins fournis par l'interpréteur standard. sys.path.append()ajoute au chemin existant. Voir ici et ici . Si vous voulez qu'un répertoire particulier vienne en premier, insérez-le simplement en tête de sys.path:

import sys
sys.path.insert(0,'/path/to/mod_directory')

Cela dit, il existe généralement de meilleures façons de gérer les importations que d'utiliser PYTHONPATHou de manipuler sys.pathdirectement. Voir, par exemple, les réponses à cette question .


Merci pour la réponse. Le problème était que je ne me rendais pas compte que pour ajouter un module emballé sous forme de fichier .egg, vous devez inclure le nom du fichier au lieu du seul répertoire en python 2.6
UnadulteratedImagination

2
Hé mec, ça a cassé mon django. Êtes-vous sûr de vouloir dire aux gens de le placer au sommet?!? !!?
R Claven

16
@RClaven, désolé, il est difficile de dire à quelle action et quels résultats vous faites référence: "mettez-le en haut" et "cassé mon django" ne sont pas très précis. Peux-tu élaborer?
Ned Deily

Pour plus d'informations sur le fonctionnement de sys.path, consultez cette réponse stackoverflow.com/a/38403654/850326
djhaskin987

2
Vous devriez vraiment utiliser "1" au lieu de "0"! Sinon, vous cassez sys.path . Voir également stackoverflow.com/q/10095037/125507 .
kadee le


6

Quant à moi, j'ai besoin de caffe à mon chemin python. Je peux ajouter son chemin au fichier /home/xy/.bashrcen ajoutant

export PYTHONPATH=/home/xy/caffe-master/python:$PYTHONPATH.

à mon /home/xy/.bashrcdossier.

Mais lorsque j'utilise pycharm, le chemin n'est toujours pas.

Je peux donc ajouter le chemin vers la PYTHONPATHvariable, par exécution -> modifier la configuration.

entrez la description de l'image ici


Le plus simple est la meilleure réponse, ajoutez ceci pour que le développement fasse fonctionner l'autocomplétion
Gang

J'ai mis à jour le .bashrc comme expliqué ci-dessus mais je ne l'ai pas reflété dans le notebook jupyter. Le bloc-notes Jupyter indique toujours que le module est introuvable.
Athar le

3

La modification temporaire des répertoires fonctionne bien pour l'importation:

cwd = os.getcwd()
os.chdir(<module_path>)
import <module>
os.chdir(cwd)

0

Lors de l'exécution d'un script Python à partir de Powershell sous Windows, cela devrait fonctionner:

$pathToSourceRoot = "C:/Users/Steve/YourCode"
$env:PYTHONPATH = "$($pathToSourceRoot);$($pathToSourceRoot)/subdirs_if_required"

# Now run the actual script
python your_script.py
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.