2014-04-09 18 views
17

Ich habe diese Struktur von Dateien (Verzeichnis und nach Pfeil-Dateien):Wie importiere ich die .py-Datei aus einem anderen Verzeichnis?

model -> py_file.py 
report -> other_py_file.py 

Haupt __init__.py:

import model 
import report 

Modellverzeichnis:

import py_file 

Bericht Verzeichnis:

import other_py_file 

jetzt in other_py_file Ich möchte py_file importieren, aber was auch immer ich versuche ich gebe Fehler, dass es kein solches Modul gibt.

Ich habe versucht, dieses: from model import py_file

Dann: import py_file

wie sieht diese beiden Ordner einander nicht sehen. Wie kann man Dateien aus anderen Verzeichnissen importieren? Muss ich einige zusätzliche Importe in init .py Dateien angeben?

+2

Sie können nicht rückwärts in eine Ordnerstruktur importieren, Ihre Struktur soll von der Wurzel aus verwendet werden und 'Import Report', die' other_py_file' importiert. Das 'Import ../ Model' wird nicht funktionieren. – Torxed

+1

@Torxed Finden Sie den Weg über den von Ihnen bereitgestellten Link. Welche Datei muss ich aus dem Namen des App-Ordners importieren: 'from my_app.model import py_file'. Ich habe etwas Ähnliches wie 'von addons.my_app.model import py_file' versucht. Als das nicht funktionierte, dachte ich, ich müsste etwas anderes machen und überspringe den Teil nur aus dem App-Verzeichnis. – Andrius

+0

Überprüfen Sie meine Lösung unten .. es passt besser zu Ihrem Modell der Programmierung, denke ich. – Torxed

Antwort

28

Sie auf das System-Pfad zur Laufzeit hinzufügen:

import sys 
sys.path.insert(0, 'path/to/your/py_file') 

import py_file 

Dies ist bei weitem der einfachste Weg, es zu tun .

+2

Ja, das ist ein einfacher Weg, der Probleme beim Importieren aus einem Ordner verursachen kann, in dem Sie zum Beispiel denselben Dateinamen haben wie eine andere Bibliothek. Das wäre im OP sowieso der Fall, also schätze ich, dass es nicht schadet ... – Torxed

+1

@Torxed Ich habe den Pfad am Anfang absichtlich eingefügt, so dass der benutzerdefinierte Pfad zuerst durchsucht wird, um Namenskonflikte zu behandeln, also würde das nicht funktionieren ein Problem sein. –

13

Python3:

import importlib.machinery 

loader = importlib.machinery.SourceFileLoader('report', '/full/path/report/other_py_file.py') 
handle = loader.load_module('report') 

handle.mainFunction(parameter) 

Dieses Verfahren verwendet werden kann, zu importieren, welche Weise Sie in einer Ordnerstruktur wollen (rückwärts, vorwärts tut nicht wirklich wichtig, ich verwende absolute Pfade, nur um sicher zu sein).

Ein großes Lob an Sebastian für eine ähnliche Lösung für Python2 spplying:

import imp 

foo = imp.load_source('module.name', '/path/to/file.py') 
foo.MyClass() 
+3

Ist das nicht übermäßig kompliziert? –

+2

@AlexThornton Nicht wirklich, da der Benutzer Python-Dateien aus dem Projektbereich importieren möchte, denke ich persönlich, dass es besser ist, absolute Pfade zu verwenden, um Dinge zu importieren, als an den globalen Importbereich anzuhängen. Meine ist auch mehr fehlertolerant, was ich predige ist eine gute Sache :) – Torxed

+0

@AlexThornton Nun, offensichtlich ist es nicht vollständig idiotensicher, aber Sie könnten theoretisch importieren '/ home/time.py' ohne die gebündelte' time' Bibliothek zu ersetzen. Angenommen, das OP würde 'sys.path' nicht voraussetzen, dies würde sicherstellen, dass Sie die richtige Bibliothek importieren, egal was passiert, egal wie Sie es tun, wird der Pfad, den Sie liefern, tatsächlich das importierte Modul sein. Sie können auch Namespaces anpassen, die Sie nicht ausführen können, wenn Sie den traditionellen 'Import ...' ausführen. Mehr darüber wird sich in einen Flammenkrieg verwandeln, über den die Lösung am besten ist, etwas, das ich nicht fördern werde, das ist eine Frage des Geschmacks, das ist es :) – Torxed

Verwandte Themen