108 votes

Comment importer un script Python depuis un répertoire parent?

Disons que j'ai la structure de répertoire suivante :

parent_dir/
    foo_dir/
        foo.py
    bar_dir/
        bar.py

Si je voulais importer bar.py depuis foo.py, comment pourrais-je le faire ?

60voto

Sven Marnach Points 133943

Si tous les répertoires concernés sont des packages Python, c'est-à-dire qu'ils contiennent tous __init__.py, alors vous pouvez utiliser

from ..bar_dir import bar

Si les répertoires ne sont pas des packages Python, vous pouvez le faire en manipulant sys.path, mais vous ne devriez pas le faire.

49voto

prrao Points 2278

Vous pouvez utiliser les modules sys et os pour des imports généralisés. Dans le fichier foo.py, commencez par les lignes suivantes :

import sys
import os
sys.path.append(os.path.abspath('../bar_dir'))
import bar

4voto

Sukhmeet Sethi Points 51

Disons que vous avez la structure suivante :

root
  |_ productconst.py
  |_ products
     |_ __init__.py

Et si vous souhaitez importer productconst dans products.__init__, alors vous pouvez utiliser ce qui suit :

from ..productconst import *

2voto

Sau001 Points 415

La plupart des réponses proposées ont reposé sur la modification de sys.path. À mon avis, cela n'est pas nécessaire si vous pouvez conserver correctement la structure relative des dossiers. J'ai été inspiré par la réponse à une question similaire :

Veuillez voir mon exemple ci-dessous. J'ai suivi la même structure de dossiers que dans votre question

Structure du dossier

description de l'image

Après avoir développé le dossier parent_dir

description de l'image

bar_dir/bar.py

Le fichier bar.py implémente une classe squelettique Bar

class Bar():
    def __init__(self) -> None:
        pass

    def __repr__(self) -> str:
        return "Ceci est une instance de Bar"

    def some_method(self) ->None:
        pass

bar_dir/init.py

from .bar import Bar

foo_dir/foo.py

Le fichier foo.py implémente une classe simple Foo qui fait référence à la classe Bar à travers un paramètre de constructeur.

from ..bar_dir import Bar

class Foo():
    def __init__(self ,bar_instance: Bar) -> None:        
        self._bar=bar_instance

    def __repr__(self) -> str:
        return f"Vous êtes à l'intérieur d'une instance de Foo et vous venez d'accéder à bar={self._bar}"

foo_dir/init.py

from .foo import Foo

sfo_main.py

Il s'agit du script principal qui assemble les packages foo_dir et bar_dir

import parent_dir.bar_dir as bar_lib
import parent_dir.foo_dir as foo_lib

if __name__ == "__main__":
    f=foo_lib.Foo(bar_instance=bar_lib.Bar())
    print(f"Ceci est une instance de foo={f}")
    print(f"{bar_lib.Bar()}")

Sortie de sfo_main.py

description de l'image

Pourquoi utiliser un fichier init.py ?

https://docs.python.org/3.9/tutorial/modules.html

Documentation sur les imports relatifs

https://docs.python.org/3/reference/import.html

0voto

Gothburz Points 2286

Si vous rencontrez des problèmes en python 3+, la solution suivante a fonctionné pour moi en utilisant sys.path.append("..").

sys.path.append("..")
from bar_dir import bar

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