Dans le script Python, comment définir PYTHONPATH?

115

Je sais comment le définir dans mon / etc / profile et dans mes variables d'environnement.

Mais que faire si je veux le définir pendant un script? S'agit-il d'import os, sys? Comment fait-on ça?

TIMEX
la source

Réponses:

192

Vous ne définissez pas PYTHONPATH, vous ajoutez des entrées sys.path. C'est une liste de répertoires dans lesquels rechercher les packages Python, vous pouvez donc simplement ajouter vos répertoires à cette liste.

sys.path.append('/path/to/whatever')

En fait, sys.pathest initialisé en divisant la valeur de PYTHONPATHsur le caractère séparateur de chemin ( :sur les systèmes de type Linux, ;sous Windows).

Vous pouvez également ajouter des répertoires à l'aide de site.addsitedir, et cette méthode prendra également en compte les .pthfichiers existant dans les répertoires que vous passez. (Ce ne serait pas le cas avec les répertoires que vous spécifiez PYTHONPATH.)

David Z
la source
11
Cela fait de nombreuses années que cette réponse a été publiée, mais je veux quand même ajouter que si vous voulez vous assurer que Python vérifie le nouveau répertoire avant tous les autres lors de l'importation, vous devez mettre le nouveau répertoire en premier dans la liste, comme dans sys.path.insert(0, '/path/to/whatever').
wecsam
39

Vous pouvez obtenir et définir des variables d'environnement via os.environ:

import os
user_home = os.environ["HOME"]

os.environ["PYTHONPATH"] = "..."

Mais puisque votre interpréteur est déjà en cours d'exécution, cela n'aura aucun effet. Vous feriez mieux d'utiliser

import sys
sys.path.append("...")

qui est le tableau dans lequel vous PYTHONPATHserez transformé au démarrage de l'interpréteur.

Miku
la source
18

Si vous mettez sys.path.append('dir/to/path')sans cocher il est déjà ajouté, vous pourriez générer une longue liste au format sys.path. Pour cela, je recommande ceci:

import sys
import os # if you want this directory

try:
    sys.path.index('/dir/path') # Or os.getcwd() for this directory
except ValueError:
    sys.path.append('/dir/path') # Or os.getcwd() for this directory
Francisco Manuel Garca Botella
la source
2
Agréable. Très pythonique.
PartialOrder
1
Comment puis-je vider le PythonPath? Je ne veux pas ajouter. Je veux le vider et mettre ce que je veux seulement à l'intérieur. Y a-t-il un moyen de faire cela?
Schütze
Avez-vous essayé de le réinitialiser en appelant sys.path .__ init __ ()? Cela devrait vider le chemin python. J'espère que cela t'aides.
Thayz
@ francisco-manuel-garca-botella Répondre à de vieilles questions est le bienvenu sur ce site! Rien à redire.
user7610
Je ne suis pas d'accord pour dire que c'est pythonique, et je dirais que ce n'est pas une bonne approche de programmation. La gestion des exceptions est très coûteuse lorsque l'exception se produit, vous ne voulez donc pas l'utiliser pour remplacer une instruction "if" où il est tout à fait possible que vous utilisiez l'autre. Un simple if 'mypath' dans sys.path ... else ... serait mon conseil.
markgalassi
6

PYTHONPATH se termine dans sys.path , que vous pouvez modifier au moment de l'exécution.

import sys
sys.path += ["whatever"]
unbeli
la source
Y a-t-il une raison de préférer cette réponse à celle de @DavidZ?
Dror
Si rien d'autre, c'est moins verbeux.
tripleee
-1

vous pouvez définir PYTHONPATH, par os.environ['PATHPYTHON']=/some/path, puis vous devez appeler os.system('python')pour redémarrer le shell python pour rendre le chemin nouvellement ajouté efficace.

tesla1060
la source
1
os.system()ne "redémarre pas le shell python", il démarre une nouvelle instance Python interactive. Lorsque vous revenez de cela, vous êtes de retour dans le script d'appel.
tripleee
-2

Je Linux cela fonctionne aussi:

import sys
sys.path.extend(["/path/to/dotpy/file/"])
fouet
la source