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

13voto

Al Conrad Punkte 1310

Um in diesem Fall Bar.py in Foo.py zu importieren, muss ich zuerst diese Ordner in Python-Pakete umwandeln, und zwar so:

dirFoo\
    __init__.py
    Foo.py
    dirBar\
        __init__.py
        Bar.py

Dann würde ich das in Foo.py so machen:

from .dirBar import Bar

Wenn ich wollte, dass der Namensabstand wie Bar aussieht. was auch immer , oder

from . import dirBar

Wenn ich den Namensabstand dirBar.Bar. was auch immer . Dieser zweite Fall ist nützlich, wenn Sie mehrere Module unter dem dirBar-Paket haben.

13voto

jhana Punkte 131

Meiner Meinung nach ist es am besten, die __ init __.py im Ordner und rufen Sie die Datei mit

from dirBar.Bar import *

Es wird nicht empfohlen, sys.path.append() zu verwenden, weil etwas schief gehen könnte, wenn Sie denselben Dateinamen wie das vorhandene Python-Paket verwenden. Ich habe das nicht getestet, aber das wird nicht eindeutig sein.

0 Stimmen

Seltsam, dass from dirBar.Bar import * funktioniert, aber nicht from dirBar.Bar import Bar Wissen Sie, warum * funktioniert? Was wäre, wenn ich mehrere Dateien in dirBar/ hätte und nur ein paar davon holen wollte (mit einer Methode wie der, die Sie hier gepostet haben)?

2 Stimmen

@tester: Verwenden Sie from dirBar import Bar .

0 Stimmen

@tester das liegt daran, dass die from gibt die Quelle an, und alles nach import ist das, was man aus dieser Quelle entnehmen kann. from dirBar.Bar import Bar bedeutet "Aus der Quelle, importiere die Quelle selbst", was keinen Sinn macht. die * bedeutet aber: "Gib mir alles aus der Quelle".

12voto

Brent Bradburn Punkte 45995

Der schnelle und einfache Weg für Linux-Benutzer

Wenn Sie nur ein wenig herumbasteln und sich nicht um Bereitstellungsprobleme kümmern, können Sie einen symbolischen Link verwenden (vorausgesetzt, Ihr Dateisystem unterstützt ihn), um das Modul oder Paket direkt im Ordner des anfragenden Moduls sichtbar zu machen.

ln -s (path)/module_name.py

o

ln -s (path)/package_name

Hinweis: Ein "Modul" ist jede Datei mit der Erweiterung .py und ein "Paket" ist jeder Ordner, der die Datei enthält __init__.py (die eine leere Datei sein kann). Vom Standpunkt der Verwendung sind Module und Pakete identisch - beide stellen ihre enthaltenen "Definitionen und Anweisungen" zur Verfügung, wie sie über die import Befehl.

ご覧ください。 http://docs.python.org/2/tutorial/modules.html

5voto

Josh Punkte 69

Hinzufügen einer __init__.py Datei:

dirFoo\
    Foo.py
    dirBar\
        __init__.py
        Bar.py

Fügen Sie dann diesen Code an den Anfang von Foo.py:

import sys
sys.path.append('dirBar')
import Bar

5 Stimmen

Wenn dirBar ist bereits ein Python-Paket (durch die Existenz von dirBar/__init__.py ), ist es nicht notwendig, an die dirBar a sys.path nicht? Die Aussage import Bar von Foo.py sollte ausreichen.

3voto

Der_Meister Punkte 4609

Beispiel für einen relativen sys.path:

# /lib/my_module.py
# /src/test.py

if __name__ == '__main__' and __package__ is None:
    sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib')))
import my_module

Basierend auf ce Antwort.

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