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?

L'imagination sans mélange
la source
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 .

Ned Deily
la source
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
9

Vous pouvez utiliser:

import os
path = 'the path you want'
os.environ['PATH'] += ':'+path
Δημητρης Παππάς
la source
vous avez besoin ';' dans les fenêtres.
sanjivgupta
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

Jayhello
la source
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)
utilisateur3517603
la source
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
Alexandre Pacha
la source