2013-05-27 9 views
24

Ich habe die folgende Verzeichnisstruktur:Datei vom übergeordneten Verzeichnis importieren?

application 
    tests 
     main.py 
    main.py 

application/main.py einige Funktionen enthält.

tests/main.py enthält meine Tests für diese Funktionen, aber ich kann die oberste main.py nicht importieren. Ich erhalte den folgenden Fehler:

ImportError: Import by filename is not supported. 

ich mit folgender Syntax zu importieren bin versucht:

import main 

Was mache ich falsch?

+0

ich zum ersten Mal würde lesen Sie die Dokumentation verwenden: http://docs.python.org/2/tutorial /modules.html#packages – Blender

+0

Nun, Sie können nicht denselben Dateinamen importieren, an dem Sie gerade arbeiten. – squiguy

+0

In welcher Datei machst du 'import main'? – Aivar

Antwort

4

Sie können keine Objekte aus übergeordneten/gleichgeordneten Verzeichnissen als solche importieren. Sie können nur Objekte aus Verzeichnissen des Systempfads oder des aktuellen Verzeichnisses oder der Unterverzeichnisse eines Pakets importieren. Da Sie keine __init__.py Dateien haben, bilden Ihre Dateien kein Paket und Sie können sie nur importieren, indem Sie sie auf dem Systempfad platzieren.

+1

Ohne zu sagen, dass Sie nicht können, ist ein wenig stark. Sie können es nicht ohne ein wenig zusätzlichen Aufwand tun, aber alles, was Sie tun müssen, ist das übergeordnete Verzeichnis auf den Pfad zu setzen und Sie können es tun. –

+2

@BryanOakley: Das fällt unter das, was ich über "sie auf dem Systempfad" gesagt habe. – BrenBarn

+0

+ nachdem ich durch viele SOQ gegangen bin, erkannte ich, dass Python blind ist, in übergeordneten Verzeichnissen nachzuschlagen. – sakhunzai

10

Sie müssen die Anwendung dir auf deinem Weg hinzufügen:

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

Oder von Shell:

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

Falls Sie Windows verwenden: Variable Pfad in windows auf Hinzufügen.

Oder von der Kommandozeile:

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

Zunächst einmal müssen Sie Ihre Verzeichnisse in Pakete machen, indem __init__.py Hinzufügen von Dateien:

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

Dann sollten Sie sicherstellen, dass das Verzeichnis über den Antrag ist auf sys.path. Es gibt viele Möglichkeiten, das zu tun, wie machen die Anwendung infto einem Paket und die Installation es, oder einfach nur die Dinge in den richtigen Ordner usw.

Then your imports will work.

+6

Hinzufügen von '__init__.py' Sie machen Ihre Verzeichnisse zu Paketen, nicht zu Modulen. – raben

31

Ausführung Wenn Sie Ihr Skript möchten mehr tragbar sein, Sehen Sie das übergeordnete Verzeichnis zu finden, automatisch:

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

in python. existiert für gleiches Verzeichnis, .. für übergeordnetes Verzeichnis eine Datei aus übergeordnetem Verzeichnis importieren Sie ..

from .. import filename (without .py extension)

+1

Das hat bei mir nicht funktioniert, 'ValueError: Versuchter relativer Import in Nicht-Paket' – nobism

Verwandte Themen