Chaque fois que j'utilise sys.path.append
, le nouveau répertoire sera ajouté. Cependant, une fois que je ferme python, la liste revient aux valeurs précédentes (par défaut?). Comment ajouter en permanence un répertoire à PYTHONPATH
?
Vous devez ajouter votre nouveau répertoire à la variable d'environnement PYTHONPATH
, séparé par un point-virgule du contenu précédent. Sous n'importe quelle forme d'Unix, vous pouvez le faire dans un script de démarrage adapté au shell que vous utilisez (.profile
ou à tout autre choix, en fonction de votre shell préféré) avec une commande qui, là encore, dépend du shell en question. Sous Windows, vous pouvez le faire par le biais de l'interface graphique du système.
superuser.com
peut être un meilleur endroit pour demander davantage, c'est-à-dire pour plus de détails si vous avez besoin de précisions sur la manière d'enrichir une variable d'environnement dans la plate-forme choisie et dans Shell, car ce n'est pas vraiment une question de programmation.
Si vous utilisez bash (sur un Mac ou une distribution GNU/Linux), ajoutez ceci à votre ~/.bashrc
export PYTHONPATH="${PYTHONPATH}:/my/other/path"
Au lieu de manipuler PYTHONPATH
, vous pouvez également créer un fichier de configuration path . Commencez par rechercher 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 fichier .pth
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"
Cela fonctionne sous Windows
Vous pourrez alors voir tous les modules dans ces chemins à partir de vos scripts.
Si quelqu'un est toujours confus, si vous utilisez un Mac, procédez comme suit:
open .bash_profile
export PYTHONPATH=$PYTHONPATH:foo/bar
Vous pouvez ajouter le chemin via votre fichier pythonrc, dont la valeur par défaut est ~/.pythonrc sous linux. c'est à dire.
import sys
sys.path.append('/path/to/dir')
Vous pouvez également définir la variable d'environnement PYTHONPATH
dans un fichier rc global, tel que ~/.profile
sur mac ou linux ou via Panneau de configuration -> Système -> onglet Avancé -> Variables d'environnement sous Windows.
Pour donner un peu plus d'explications, Python construira automatiquement ses chemins de recherche (comme mentionné ci-dessus et ici ) à l'aide du script site.py
(généralement situé dans sys.prefix + lib/python<version>/site-packages
ainsi que 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 dépendant de la plate-forme, tels que /usr/{lib,share}/python<version>/dist-packages
, /usr/local/lib/python<version>/dist-packages
dans le chemin de recherche et recherche également dans ces chemins les fichiers de configuration <package>.pth
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 sous Ubuntu, il s'agit de /usr/local/lib/python2.7/dist-packages/easy-install.pth
. Sur un système typique, il existe un tas de ces fichiers .pth qui peuvent expliquer certains chemins inattendus dans sys.path:
python -c 'import sys; print(sys.path)'
Donc, on peut créer un fichier .pth et mettre dans n’importe lequel de ces répertoires (y compris le sitedir comme mentionné ci-dessus ). Cela semble être la façon dont la plupart des paquets sont ajoutés à sys.path par opposition à PYTHONPATH.
Remarque: Sous OSX, site.py a ajouté un chemin de recherche supplémentaire spécial pour 'framework builds' (mais semble fonctionner pour une utilisation normale de python en ligne de commande): /Library/Python/<version>/site-packages
(par exemple, pour Python2.7: /Library/Python/2.7/site-packages/
). sont supposés être installés (voir le README dans ce répertoire). Vous pouvez donc ajouter un fichier de configuration de chemin contenant des chemins de recherche supplémentaires, par exemple. créez un fichier appelé /Library/Python/2.7/site-packages/pip-usr-local.pth
qui contient /usr/local/lib/python2.7/site-packages/
, puis le système python ajoutera ce chemin de recherche.
Sous Linux, vous pouvez créer un lien symbolique de votre paquet vers un répertoire de PYTHONPATH sans avoir à vous préoccuper des variables d'environnement. Quelque chose comme:
ln -s /your/path /usr/lib/pymodules/python2.7/
Pour moi, cela a fonctionné lorsque j'ai modifié le fichier .bash_profile
. Changer simplement le fichier .bashrc
n'a fonctionné que jusqu'au redémarrage du 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 fichier .bash_profile
.
L'ajout de export PYTHONPATH="${PYTHONPATH}:/my/other/path"
au ~/.bashrc risque de ne pas fonctionner si PYTHONPATH
n'existe pas (en raison du :
).
export PYTHONPATH="/my/other/path1"
export PYTHONPATH="${PYTHONPATH}:/my/other/path2"
L'ajout de ce qui précède à mon ~/.bashrc a été très utile pour Ubuntu 16.04
Juste pour ajouter la réponse de awesomo, vous pouvez également ajouter cette ligne dans votre ~/.bash_profile
ou ~/.profile
Sur MacOS, au lieu de donner le chemin à une bibliothèque spécifique. Donner le chemin complet du dossier du projet racine dans
~./bash_profile
fait ma journée, par exemple:
export PYTHONPATH="${PYTHONPATH}:/Users/<myuser>/project_root_folder_path"
après cela faire:
source ~./bash_profile
L'ajout d'un nouveau chemin à PYTHONPATH se fait manuellement par:
ajout du chemin à votre profil ~/.bashrc, dans 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.
J'ai ajouté en permanence dans Windows Vista, Python 3.5
Système> Panneau de configuration> Paramètres système avancés> Variables d'environnement avancées> Tapez> Variables système> (si PYTHONPATH n'apparaît pas dans la colonne Variable) (cliquez sur) Nouveau> Nom de la variable: PYTHONPATH> Valeur de la variable:
S'il vous plaît, écrivez le répertoire dans la valeur de la variable. Ce sont des détails de la réponse de Blue Peppers.
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']
Le script ci-dessous fonctionne sur toutes les plates-formes car c'est du pur Python. Il utilise le chemin pathlib, documenté ici https://docs.python.org/3/library/pathlib.html , pour le rendre multi-plateforme. 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))
Dans Python 3.6.4, vous pouvez conserver sys.path pendant les sessions python comme suit:
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