139 votes

Python : Meilleure façon d'ajouter à sys.path relatif au script en cours d'exécution

J'ai un répertoire rempli de scripts (disons project/bin ). Je dispose également d'une bibliothèque située à project/lib et que les scripts le chargent automatiquement. C'est ce que j'utilise normalement au début de chaque scripts :

#!/usr/bin/python
from os.path import dirname, realpath, sep, pardir
import sys
sys.path.append(dirname(realpath(__file__)) + sep + pardir + sep + "lib")

# ... now the real code
import mylib

C'est un peu lourd, moche, et il faut le coller au début de chaque fichier. Existe-t-il une meilleure façon de procéder ?

Ce que j'espère vraiment, c'est quelque chose d'aussi fluide que cela :

#!/usr/bin/python
import sys.path
from os.path import pardir, sep
sys.path.append_relative(pardir + sep + "lib")

import mylib

Ou mieux encore, quelque chose qui ne se briserait pas lorsque mon éditeur (ou quelqu'un d'autre qui a un accès autorisé) déciderait de réorganiser les importations dans le cadre de son processus de nettoyage :

#!/usr/bin/python --relpath_append ../lib
import mylib

Cette solution ne serait pas directement portable sur les plates-formes non-posix, mais elle permettrait de garder les choses propres.

156voto

jterrace Points 21939

Voici ce que j'utilise :

import os, sys
sys.path.append(os.path.join(os.path.dirname(__file__), "lib"))

43voto

DusX Points 431

J'utilise :

import sys,os
sys.path.append(os.getcwd())

33voto

Anurag Uniyal Points 31931

Si vous ne souhaitez pas modifier chaque fichier

  • Installez votre bibliothèque comme une bibliothèque python normale
    o
  • Set (jeu de mots) PYTHONPATH à votre lib

ou si vous souhaitez ajouter une seule ligne à chaque fichier, ajoutez une déclaration d'importation au début du fichier, par exemple

import import_my_lib

garder import_my_lib.py dans la corbeille et import_my_lib peut correctement définir le chemin de python à n'importe quel endroit. lib vous voulez

22voto

ekhumoro Points 23190

Créer un module d'accompagnement project/bin/lib qui contient ceci :

import sys, os

sys.path.insert(0, os.path.join(
    os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'lib'))

import mylib

del sys.path[0], sys, os

Ensuite, vous pouvez remplacer tout ce qui se trouve en haut de vos scripts par :

#!/usr/bin/python
from lib import mylib

18voto

GollyJer Points 1108

Utilisation de python 3.4+

import sys
from pathlib import Path

# As PosixPath
sys.path.append(Path(__file__).parent / "lib")

# Or as str as explained in https://stackoverflow.com/a/32701221/11043825
sys.path.append(str(Path(__file__).parent / "lib"))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X