Python path

Le python path c'est quoi?

Le python path indique à python quels dossiers il doit prendre en compte pour sa recherche de modules. Vous pouvez voir cette liste de cette manière:

>>> import sys
>>> sys.path
['/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']

Vous ne pouvez donc pas faire d'import de module si celui-ci ne se trouve pas dans ces dossiers.

Importer ses modules

Créons le dossier /home/olivier/test, puis le package utils dans ce dossier.

Dans ce package on crée un fichier func.py avec une fonction donne_moi_ton_nom:

func.py

#!/usr/bin/python2.7
#-*- coding: utf-8 -*-

def donne_moi_ton_nom():
    return "Olivier"

Essayons d'intégrer notre module depuis notre interpréteur python:

olivier@bigone:~$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from utils.func import *
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named utils.func

Une erreur apparait: "Le module est introuvable".

Le dossier courant

Il existe une première manière de régler ce problème: exécuter l'interpréteur dans le dossier parent du package:

olivier@bigone:~$ cd test/
olivier@bigone:~/test$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from utils.func import *
>>> donne_moi_ton_nom()
'Olivier'

Alors cela est possible parce que la python path inclu le dossier en cours.

Ajouter un dossier au PYTHONPATH

Une autre manière est d'ajouter le chemin /home/olivier/test au PYTHONPATH. Pour cela, il vous faudra exécuter la commande suivante dans votre terminal:

olivier@bigone:~$ export PYTHONPATH=$PYTHONPATH:/home/olivier/test

Vérifions le PYTHONPATH dans l'interpréteur:

Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/home/olivier', '/home/olivier/test', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']

Parfait, le dossier est bien inclu. Le problème c'est que si vous fermez votre terminal et que vous retournez sur l'interprếteur, le dossier en question aura disparu du PYTHONPATH.

Ajouter un dossier au PYTHONPATH de manière permanente

Pour rendre cette action pérenne, il vous faudra éditer le fichier /home/olivier/.bashrc et y ajouter la commande:

export PYTHONPATH=$PYTHONPATH:/home/olivier/test

Ainsi cette commande sera executée à chaque ouverture de terminal.

Ajouter un dossier au PYTHONPATH en python

Dernière méthode pour ajouter un dossier au PYTHONPATH: l'indiquer directement dans le code

>>> import sys
>>> sys.path.insert(0, "/home/olivier/scripts")

Cette méthode ne marchera cependant que sur le script en cours.