126 votes

Importer un fichier depuis le répertoire parent ?

J'ai la structure de répertoire suivante :

application
    tests
        main.py
    main.py

application/main.py contient quelques fonctions.

tests/main.py contiendra mes tests pour ces fonctions mais je ne peux pas importer le niveau supérieur main.py. J'obtiens l'erreur suivante :

ImportError: Import by filename is not supported.

J'essaie d'importer en utilisant la syntaxe suivante :

import main

Qu'est-ce que je fais de mal ?

111voto

Si vous souhaitez que votre script soit plus portable, pensez à trouver le répertoire parent automatiquement :

import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# import ../db.py
import db

53voto

0x90 Points 8193

Vous devez ajouter le répertoire de l'application à votre chemin :

import sys
sys.path.append("/path/to/dir")
from app import object

Ou de la coquille :

setenv PATH $PATH:"path/to/dir"

Si vous utilisez Windows : Ajout d'une variable au chemin dans Windows .

Ou à partir de la ligne de commande :

set PATH=%PATH%;C:\path\to\dir

30voto

Mr_and_Mrs_D Points 4569

La plupart des autres réponses ne sont pas correctes, malheureusement. LennartRegebro's (et celui de BrenBarn) qui est incomplet. Pour le bénéfice des futurs lecteurs - le PO devrait, tout d'abord, ajouter l'élément __init__.py comme dans

root
    application
        __init__.py
        main.py
        tests
            __init__.py
            main.py

alors :

$ cd root
$ python -m application.tests.main

o

$ cd application
$ python -m tests.main

L'exécution d'un script directement à l'intérieur de son paquetage est un anti-modèle - la manière correcte est l'exécution avec la commande -m passe du répertoire parent du paquet Root - de cette façon, tous les paquets sont détectés et les importations relatives/absolues fonctionnent comme prévu.

26voto

Lennart Regebro Points 52510

Tout d'abord vous devez transformer vos répertoires en paquets, en ajoutant __init__.py des fichiers :

application
    tests
        __init__.py
        main.py
    __init__.py
    main.py

Ensuite, vous devez vous assurer que le répertoire au-dessus de l'application est sur sys.path . Il existe de nombreuses façons de le faire, par exemple en créant l'application dans un paquet et en l'installant, ou en exécutant simplement les choses dans le bon dossier, etc.

Alors vos importations fonctionneront.

9voto

BrenBarn Points 63718

Vous ne pouvez pas importer des choses à partir de répertoires parents/soeurs en tant que tels. Vous ne pouvez importer des éléments qu'à partir des répertoires du chemin d'accès au système, du répertoire courant ou des sous-répertoires d'un paquet. Puisque vous n'avez pas de __init__.py vos fichiers ne forment pas un paquet, et vous ne pouvez les importer qu'en les plaçant dans le chemin du système.

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