web-dev-qa-db-fra.com

Ajouter définitivement un répertoire à PYTHONPATH?

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?

255
John Howard

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.

112
Alex Martelli

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

export PYTHONPATH="${PYTHONPATH}:/my/other/path"
360
awesomo

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"
74
sth

Cela fonctionne sous Windows

  1. Sous Windows, avec Python 2.7, accédez au dossier d’installation de 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.

Vous pourrez alors voir tous les modules dans ces chemins à partir de vos scripts.

26
auserdude

Si quelqu'un est toujours confus, si vous utilisez un Mac, procédez comme suit:

  1. Ouvrir le terminal
  2. Tapez 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é
19
entrepaul

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.

19
Blue Peppers

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.

11
Pierz

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/
9
Zah

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.

9
Peter Piper

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

6
boyangeor

Juste pour ajouter la réponse de awesomo, vous pouvez également ajouter cette ligne dans votre ~/.bash_profile ou ~/.profile

5
janex

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
3
testsingh

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.

1
wpmoradi

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.

0
Cloud Cho

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']
0
Al Kari

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))
0
andrei deusteanu

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

0
Rubber Duck