Ajouter définitivement un répertoire à PYTHONPATH?

324

Chaque fois que j'utilise sys.path.append, le nouveau répertoire sera ajouté. Cependant, une fois que je ferme python, la liste reviendra aux valeurs précédentes (par défaut?). Comment ajouter définitivement un répertoire à PYTHONPATH?

John Howard
la source

Réponses:

135

Vous devez ajouter votre nouveau répertoire à la variable d'environnement PYTHONPATH, séparé par deux points du contenu précédent de celle-ci. Dans n'importe quelle forme d'Unix, vous pouvez le faire dans un script de démarrage approprié au shell que vous utilisez ( .profileou quoi que ce soit, selon votre shell préféré) avec une commande qui, encore une fois, dépend du shell en question; dans Windows, vous pouvez le faire via l'interface graphique du système à cet effet.

superuser.com peut être un meilleur endroit pour demander plus, c'est-à-dire pour plus de détails si vous avez besoin de détails sur la façon d'enrichir une variable d'environnement dans la plate-forme et le shell de votre choix, car ce n'est pas vraiment une question de programmation en soi.

Alex Martelli
la source
8
Errata: le séparateur sur les fenêtres serait un point-virgule. Si vous devez remplacer les chemins d'accès système sur Windows, la définition via l'interface graphique en tant que variable d'environnement utilisateur peut ne pas être suffisante, car les variables utilisateur sont ajoutées aux variables système. Dans ces cas, vous devrez recourir à un script de démarrage qui effectue les ajustements nécessaires.
Nathan Ernst
1
@Nathan, tx pour le rappel sur virgule, mais (si vous êtes un administrateur bien sûr) vous pouvez définir le système env.vars sur les fenêtres (plus, l'OP ne demande pas comment passer outre le chemin, juste comment append lui , donc, un utilisateur env.var conviendra également pour cela! -).
Alex Martelli
malheureusement, je ne suis pas administrateur sur mon PC de travail, je dois donc recourir à de telles mesures. :(
Nathan Ernst
439

Si vous utilisez bash (sur une distribution Mac ou GNU / Linux), ajoutez ceci à votre ~/.bashrc

export PYTHONPATH="${PYTHONPATH}:/my/other/path"
awesomo
la source
28
Cela a parfaitement fonctionné pour moi, mais assurez-vous que le répertoire vers lequel vous pointez a le fichier init .py le plus haut dans votre structure de répertoires. Ce n'était pas parfaitement clair pour moi au début. Par exemple, j'ai essayé d' exporter PYTHONPATH = $ PYTHONPATH: / Users / joey / repos mais cela n'a pas fonctionné car mon répertoire repos n'avait pas _ init_ .py. En descendant un répertoire plus loin: / Users / joey / repos / specificRepo a fait l'affaire. Maintenant, python peut parcourir n'importe quel répertoire descendant connecté au répertoire specificRepo qui contient un init .py!
Qiao Yi
3
cela a fonctionné pour moi, mais pourriez-vous expliquer où se trouve cette variable PYTHONPATH? et comment "exporter PYTHONPATH" sait-il localiser ce fichier exact?
appleLover
42
rappelez-vous après avoir édité ~/.bashrcpuis exécutez source ~/.bashrcvoir stackoverflow.com/questions/2518127/…
b_dev
2
Je pense que c'est une mauvaise idée de mettre sudo suau début de votre fichier .bashrc. Ce message est d'accord avec moi. Sur mon système, au moins, ce n'est même pas nécessaire.
LondonRob
Telle est la réponse.
Aerin
88

Au lieu de manipuler, PYTHONPATHvous pouvez également créer un fichier de configuration de chemin . Découvrez d'abord dans quel répertoire Python recherche ces informations:

python -m site --user-site

Pour une raison quelconque, cela ne semble pas fonctionner dans Python 2.7. Là, vous pouvez utiliser:

python -c 'import site; site._script()' --user-site

Créez ensuite un .pthfichier dans ce répertoire contenant le chemin que vous souhaitez ajouter (créez le répertoire s'il n'existe pas).

Par exemple:

# find directory
SITEDIR=$(python -m site --user-site)

# create if it doesn't exist
mkdir -p "$SITEDIR"

# create new .pth file with our path
echo "$HOME/foo/bar" > "$SITEDIR/somelib.pth"
qch
la source
J'ai essayé cela en utilisant Python 2.6 et cela ne semble pas fonctionner pour moi
Lorcan O'Neill
4
Je viens de lier ce répertoire à mon propre répertoire de bibliothèque et d'y stocker tous mes scripts. A bien fonctionné.
firesofmay
Résolu de le réessayer après avoir retrouvé ce sujet et a réussi à le faire fonctionner comme ci-dessus cette fois! Excuses votées et contrites :)
Lorcan O'Neill
Cela fonctionne parfaitement, j'étais sur la bonne voie mais python -m site --user-siteet les (create the directory if it doesn't exist)parties étaient ce que je manque à la faire fonctionner.
Aurélien Ooms
1
Dois-je franchir une étape supplémentaire pour que python reconnaisse le chemin supplémentaire vers somelib.pth? Sinon, devinez pourquoi cela pourrait ne pas fonctionner?
Miladiouss
38

Cela fonctionne sous Windows

  1. Sous Windows, avec Python 2.7, accédez au dossier de configuration Python.
  2. Ouvrez Lib / site-packages.
  3. Ajoutez un fichier example.pth vide à ce dossier.
  4. Ajoutez le chemin requis au fichier, un pour chaque ligne.

Ensuite, vous pourrez voir tous les modules dans ces chemins à partir de vos scripts.

auserdude
la source
3
OMI, c'est la meilleure solution, car elle ne dépend pas du choix du shell ou de l'environnement de travail. Fonctionne également sur Linux, où le chemin par défaut de python est "/usr/local/lib/pythonX.Y/site-packages". Si cela ne fonctionne pas, essayez plutôt de placer votre fichier .pth dans le répertoire dist-packages.
matus
1
Windows 7, Python 3.6.5. Telle est la réponse. Comme l'a écrit auserdude: Créez le "example.pth" dans le dossier Lib / site-packages de Python, puis ajoutez votre chemin comme suit: C: \ somefolder \ anotherfolder \ targetfolder
JayJay123
excellente réponse, fonctionne également avec python 3.7 sur windows 10, mon chemin Windows 10 est: "C: \ Users \ {usrName} \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib"
Ali80
Peut confirmer qu'il fonctionne pour Python 3.6.7 sur Windows 10. Cependant, notez que le chemin est ajouté à votre PYTHONPATH avec des moyens que votre module ajouté ne sera pas trouvé dans le cas d'une collision de noms.
BramAppel
25

Si quelqu'un est toujours confus - si vous êtes sur un Mac, procédez comme suit:

  1. Ouvrir le terminal
  2. Type open .bash_profile
  3. Dans le fichier texte qui apparaît, ajoutez cette ligne à la fin: export PYTHONPATH=$PYTHONPATH:foo/bar
  4. Enregistrez le fichier, redémarrez le terminal et vous avez terminé
entrepaul
la source
2
Quiconque se demande comment voir le chemin du python, utilise: quel python
Arindam Roychowdhury
je suis sûr que vous devez aussi recharger le terminal
Utilisateur
en fait, la exportclé était la chose qui me manquait !!!!, a voté, merci beaucoup!
a_m_dev
21

Vous pouvez ajouter le chemin via votre fichier pythonrc, qui est par défaut ~ / .pythonrc sous linux. c'est à dire.

import sys
sys.path.append('/path/to/dir')

Vous pouvez également définir la PYTHONPATHvariable d'environnement, dans un fichier rc global, tel que ~/.profilesur mac ou linux, ou via le Panneau de configuration -> Système -> onglet Avancé -> Variables d'environnement sur Windows.

Poivrons bleus
la source
40
sys.path.append ('/ path / to / dir') n'ajoute pas définitivement l'entrée.
jeremyjjbrown
15

Pour donner un peu plus d'explications, Python construira automatiquement ses chemins de recherche (comme mentionné ci - dessus et ici ) en utilisant le site.pyscript (généralement situé dans sys.prefix + lib/python<version>/site-packagesaussi lib/site-python). On peut obtenir la valeur de sys.prefix:

python -c 'import sys; print(sys.prefix)'

Le script site.py ajoute ensuite un certain nombre de répertoires, en fonction de la plate-forme, par exemple /usr/{lib,share}/python<version>/dist-packages, /usr/local/lib/python<version>/dist-packagesau chemin de recherche et recherche également dans ces chemins des <package>.pthfichiers de configuration qui contiennent des chemins de recherche supplémentaires spécifiques. Par exemple, easy-install conserve sa collection de packages installés qui sont ajoutés à un fichier spécifique au système, par exemple sur Ubuntu c'est /usr/local/lib/python2.7/dist-packages/easy-install.pth. Sur un système typique, il y a un tas de ces fichiers .pth autour qui peuvent expliquer certains chemins inattendus dans sys.path:

python -c 'import sys; print(sys.path)'

Ainsi, on peut créer un fichier .pth et mettre dans l'un de ces répertoires (y compris le sitedir comme mentionné ci - dessus ). Cela semble être la façon dont la plupart des packages sont ajoutés au sys.path au lieu d'utiliser le PYTHONPATH.

Remarque: Sur OSX, il y a un chemin de recherche supplémentaire spécial ajouté par site.py pour les `` builds de framework '' (mais semble fonctionner pour une utilisation normale de la ligne de commande de python): /Library/Python/<version>/site-packages(par exemple pour Python2.7:) /Library/Python/2.7/site-packages/qui est où les packages tiers sont supposés à installer (voir le fichier README dans ce répertoire). On peut donc y ajouter un fichier de configuration de chemin contenant des chemins de recherche supplémentaires, par exemple créer un fichier appelé /Library/Python/2.7/site-packages/pip-usr-local.pthqui contient /usr/local/lib/python2.7/site-packages/, puis le système python ajoutera ce chemin de recherche.

Pierz
la source
10

Pour moi, cela a fonctionné lorsque j'ai changé le .bash_profilefichier. Le simple changement de .bashrcfichier ne fonctionnait que jusqu'à ce que je redémarre le shell.

Pour python 2.7, il devrait ressembler à ceci:

export PYTHONPATH="$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python"

à la fin du .bash_profilefichier.

Peter Piper
la source
1
Si je comprends bien, cela exportera la variable pour les sessions Python lancées via le terminal, n'est-ce pas?
jxramos
1
@jxramos - oui!
Peter Piper
9

Sous linux, vous pouvez créer un lien symbolique depuis votre package vers un répertoire du PYTHONPATH sans avoir à gérer les variables d'environnement. Quelque chose comme:

ln -s /your/path /usr/lib/pymodules/python2.7/
Zah
la source
7

L'ajout export PYTHONPATH="${PYTHONPATH}:/my/other/path"au ~ / .bashrc peut ne pas fonctionner s'il PYTHONPATHn'existe pas actuellement (à cause du :).

export PYTHONPATH="/my/other/path1"
export PYTHONPATH="${PYTHONPATH}:/my/other/path2"

L'ajout de ce qui précède à mon ~ / .bashrc a fait l'affaire pour moi sur Ubuntu 16.04

boyangeor
la source
Je l'ai fait echo PYTHONPATHet rien n'est apparu! cela signifie que ce PYTHONPATH n'a pas été initié, donc je colle juste cette ligne export PYTHONPATH=$PYTHONPATH:<PATH_TO_TF>/TensorFlow/models/research/object_detectiondans mon ~/.bashrcfichier et source ~/.bashrc elle. Plus tard, quand j'ai fait écho à $ PYTHONPATH, cela m'a donné :<PATH_TO_TF>/TensorFlow/models/research/object_detection, une suggestion sur si j'ai fait quelque chose de mal?
Anu
export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detection, lorsque vous exportez PYTHONPATH pour la première fois, vous devez le faire sans la ${PYTHONPATH}:partie
boyangeor
Merci, mais chaque fois que je redémarre mon ordinateur, le chemin python est réinitialisé sur celui que j'ai défini le 1er c'est :<PATH_TO_TF>/TensorFlow/models/research/object_detection-à- dire et supprime le 2e export PYTHONPATH=$PYTHONPATH:/TensorFlow/models/research/slim. des suggestions à ce sujet, comment y remédier?
Anu
7

Sur MacOS, au lieu de donner le chemin vers une bibliothèque spécifique. Donner le chemin d'accès complet au dossier de projet racine dans

~/.bash_profile 

fait ma journée, par exemple:

export PYTHONPATH="${PYTHONPATH}:/Users/<myuser>/project_root_folder_path"

après cela:

source ~/.bash_profile
testsingh
la source
6

Pour ajouter une réponse à awesomo, vous pouvez également ajouter cette ligne dans votre ~/.bash_profileou~/.profile

janex
la source
Ajoutez à .bash_profilesi vous utilisez un shell de connexion, sinon utilisez.profile
smac89
3

L'ajout d'un nouveau chemin vers PYTHONPATH se fait manuellement en:

en ajoutant le chemin d'accès à votre profil ~ / .bashrc, dans le terminal par:

vim ~/.bashrc

collez ce qui suit dans votre profil

export PYTHONPATH="${PYTHONPATH}:/User/johndoe/pythonModule"

puis, assurez-vous de source votre profil bashrc chaque fois que vous exécutez votre code dans le terminal:

source ~/.bashrc 

J'espère que cela t'aides.

wpmoradi
la source
2

J'ai ajouté de façon permanente dans Windows Vista, Python 3.5

Système> Panneau de configuration> Paramètres système avancés> Variables d'environnement avancées (appuyez sur)> Variables système> (si vous ne voyez pas PYTHONPATH dans la colonne Variable) (cliquez) Nouveau> Nom de la variable: PYTHONPATH> Valeur de la variable:

Veuillez écrire le répertoire dans la valeur Variable. Ce sont les détails de la réponse de Blue Peppers.

Cloud Cho
la source
1

Le script ci-dessous fonctionne sur toutes les plates-formes car il s'agit de Python pur. Il utilise le chemin pathlib, documenté ici https://docs.python.org/3/library/pathlib.html , pour le faire fonctionner multiplateforme. Vous l'exécutez une fois, redémarrez le noyau et c'est tout. Inspiré par https://medium.com/@arnaud.bertrand/modifying-python-s-search-path-with-pth-files-2a41a4143574 .

from pathlib import Path
to_add=Path(path_of_directory_to_add)
from sys import path

if str(to_add) not in path:
    minLen=999999
    for index,directory in enumerate(path):
        if 'site-packages' in directory and len(directory)<=minLen:
            minLen=len(directory)
            stpi=index

    pathSitePckgs=Path(path[stpi])
    with open(str(pathSitePckgs/'current_machine_paths.pth'),'w') as pth_file:
        pth_file.write(str(to_add))
andrei deusteanu
la source
1

Il s'agit d'une mise à jour de ce fil qui contient d'anciennes réponses.

Pour ceux qui utilisent MAC-OS Catalina ou une version plus récente (> = 10.15), il a été introduit un nouveau terminal nommé zsh(un substitut à l'ancien bash).

J'ai eu quelques problèmes avec les réponses ci-dessus en raison de ce changement, et j'ai quelque peu fait une solution de contournement en créant le fichier ~/.zshrcet en collant le répertoire de fichiers dans le $PATHet$PYTHONPATH

Donc, j'ai d'abord fait:

nano ~/.zshrc

Lorsque l'éditeur a ouvert, j'ai collé le contenu suivant:

export PATH="${PATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"
export PYTHONPATH="${PYTHONPATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"

enregistré et redémarré le terminal.

IMPORTANT: Le chemin ci-dessus est défini sur le chemin de mon ordinateur, vous devrez l'adapter à votre python.

Caio Oliveira
la source
0

Dans Python 3.6.4, vous pouvez conserver sys.path sur des sessions python comme ceci:

import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print(f"current working dir: {dir_path}")

root_dir = dir_path.replace("/util", '', 1)
print(f"root dir: {root_dir}")

sys.path.insert(0, root_dir)

print(str(sys.path))

Je vous suggère fortement d'utiliser virtualenv et virtualenvwrapper sinon vous encombrerez votre chemin

Canard en caoutchouc
la source
-3

Le chemin le plus court entre A <-> B est une ligne droite;

import sys
if not 'NEW_PATH' in sys.path:
  sys.path += ['NEW_PATH']
Al Kari
la source