805 Stimmen

Importieren eines Moduls aus einem relativen Pfad

Wie importiere ich ein Python-Modul unter Angabe seines relativen Pfads?

Zum Beispiel, wenn dirFoo enthält Foo.py y dirBar y dirBar enthält Bar.py wie kann ich importieren Bar.py in Foo.py ?

Hier ist eine visuelle Darstellung:

dirFoo\
    Foo.py
    dirBar\
        Bar.py

Foo möchte einbeziehen Bar aber die Umstrukturierung der Ordnerhierarchie ist keine Option.

3 Stimmen

Sieht aus wie stackoverflow.com/questions/72852/ vielleicht?

3 Stimmen

Prüfen Sie meine Antwort, es ist die vollständigste bisher, andere funktionieren nicht in speziellen Fällen, zum Beispiel, wenn Sie das Skript aus einem anderen Verzeichnis oder aus einem anderen Python-Skript aufrufen. Siehe stackoverflow.com/questions/279237/

0 Stimmen

Ich hatte ein ähnliches Problem und ich fand dies und es funktioniert!! apt-get install python-profiler

350voto

sorin Punkte 147675

Angenommen, Ihre beiden Verzeichnisse sind echte Python-Pakete (Sie haben die __init__.py Datei in ihnen), hier ist eine sichere Lösung für die Einbeziehung von Modulen relativ zum Ort des Skripts.

Ich gehe davon aus, dass Sie dies tun wollen, weil Sie eine Reihe von Modulen in Ihr Skript aufnehmen müssen. Ich verwende dies in der Produktion in mehreren Produkten und funktioniert in vielen speziellen Szenarien wie: Skripte, die aus einem anderen Verzeichnis aufgerufen oder mit Python Execute ausgeführt werden, anstatt einen neuen Interpreter zu öffnen.

 import os, sys, inspect
 # realpath() will make your script run, even if you symlink it :)
 cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
 if cmd_folder not in sys.path:
     sys.path.insert(0, cmd_folder)

 # Use this if you want to include modules from a subfolder
 cmd_subfolder = os.path.realpath(os.path.abspath(os.path.join(os.path.split(inspect.getfile( inspect.currentframe() ))[0],"subfolder")))
 if cmd_subfolder not in sys.path:
     sys.path.insert(0, cmd_subfolder)

 # Info:
 # cmd_folder = os.path.dirname(os.path.abspath(__file__)) # DO NOT USE __file__ !!!
 # __file__ fails if the script is called in different ways on Windows.
 # __file__ fails if someone does os.chdir() before.
 # sys.argv[0] also fails, because it doesn't not always contains the path.

Außerdem können Sie auf diese Weise Python zwingen, Ihr Modul anstelle der auf dem System installierten Module zu verwenden.

Achtung! Ich weiß nicht wirklich, was passiert, wenn das aktuelle Modul innerhalb einer egg Datei. Wahrscheinlich schlägt sie auch fehl.

6 Stimmen

Kann mir jemand erklären, wie das funktioniert? Ich habe ein ähnliches Problem und ich würde gerne ein Python-Modul DIR erzwingen, anstatt eine Suche auszuführen

0 Stimmen

Unter Win 7 Pro 64x und Python 2.7 erhalte ich ein paar Fehler. 1) Ich musste inspect zur Importliste hinzufügen. 2) Der erste Wert, [0], im Tupel ist ein leerer String. Der 2., [1], zeigt den Dateinamen an. Ich vermute, dass der erste Wert der Pfad sein sollte... Hat jemand eine Idee?

2 Stimmen

Wenn Sie sich für einen Unterordner entscheiden, verwenden Sie ihn wie folgt: os.path.realpath(os.path.abspath(os.path.split(inspect.‌​getfile( inspect.currentframe() ))[0]) + "/subfolder") Do NICHT fügen Sie den Unterordner vor abspath da dies zu schwerwiegenden Fehlern führt.

333voto

S.Lott Punkte 371691

Stellen Sie sicher, dass dirBar die __init__.py Datei - dies macht ein Verzeichnis zu einem Python-Paket.

210 Stimmen

Beachten Sie, dass diese Datei völlig leer sein kann.

49 Stimmen

Wenn sich das übergeordnete Verzeichnis von dirBar nicht in sys.path dann ist das Vorhandensein von __init__.py im dirBar Verzeichnis ist nicht sehr hilfreich.

2 Stimmen

Der obige Kommentar geht davon aus, dass dirBar ein Unterpaket ist.

265voto

Andrew Cox Punkte 10236

Sie können das Unterverzeichnis auch zu Ihrem Python-Pfad hinzufügen, damit es wie ein normales Skript importiert wird.

import sys
sys.path.insert(0, <path to dirFoo>)
import Bar

6 Stimmen

Es sieht so aus, als würde Ihre Antwort nicht mit relativen Pfaden funktionieren, siehe stackoverflow.com/questions/279237/

24 Stimmen

Diese tut arbeiten mit relativen Pfaden -- Sie müssen nur verstehen, dass ein relativer Pfad davon abhängt, aus welchem Verzeichnis Sie starten, was dies zu einer schlechten Lösung für etwas anderes als einen schnellen Hack macht.

12 Stimmen

Sie können z. B. Folgendes tun sys.path.append(os.path.dirname(__file__) + "/relative/path/to/module")

118voto

lefakir Punkte 3973
import os
import sys
lib_path = os.path.abspath(os.path.join(__file__, '..', '..', '..', 'lib'))
sys.path.append(lib_path)

import mymodule

2 Stimmen

Das gefällt mir, weil man die Flexibilität hat, ein Verzeichnis nach oben zu gehen.

21 Stimmen

Sie sollten Folgendes verwenden os.path.join() anstatt durch '/' zu verbinden, was in dem (lahmen) Windows nicht funktioniert.

18 Stimmen

Das ist nicht zuverlässig. Es hängt von dem aktuellen Arbeitsverzeichnis ab, nicht von dem Verzeichnis, in dem das Skript liegt.

109voto

Sie müssen nur einfache Dinge tun, um die .py-Datei aus einem anderen Ordner zu importieren.

Nehmen wir an, Sie haben ein Verzeichnis wie:

lib/abc.py

Dann legen Sie einfach eine leere Datei im Ordner lib mit dem Namen

__init__.py

Und dann verwenden Sie

from lib.abc import <Your Module name>

Behalten Sie die __init__.py Datei in jedem Ordner der Hierarchie des Importmoduls.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X