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

76voto

bouvard Punkte 3814

Wenn Sie Ihr Projekt auf diese Weise strukturieren:

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

Von Foo.py aus sollten Sie dann in der Lage sein, Folgendes zu tun:

import dirFoo.Foo

Oder:

from dirFoo.Foo import FooObject

Gemäß Toms Kommentar erfordert dies, dass die src Ordner ist entweder über site_packages oder Ihren Suchpfad. Außerdem, wie er erwähnt, __init__.py wird implizit importiert, wenn Sie zum ersten Mal ein Modul in diesem Paket/Verzeichnis importieren. In der Regel __init__.py ist einfach eine leere Datei.

0 Stimmen

Erwähnen Sie auch, dass init .py wird importiert, wenn das erste Modul innerhalb dieses Pakets importiert wird. Außerdem wird Ihr Beispiel nur funktionieren, wenn src in den site_packages (oder im Suchpfad) enthalten ist

3 Stimmen

Dies ist die einfachste Lösung, die ich gesucht habe. Wenn die zu importierende Datei sicher in einem der Unterverzeichnisse liegt, ist diese Lösung ein Juwel.

1 Stimmen

Ich habe das Gleiche versucht und bin gescheitert. Ich weiß nicht, warum. ImportFehler: Kein Modul namens customMath

45voto

Peter Crabtree Punkte 899

Dies ist der relevante PEP:

http://www.python.org/dev/peps/pep-0328/

Insbesondere, wenn dirFoo ein Verzeichnis oberhalb von dirBar ist...

In dirFoo \Foo.py :

from ..dirBar import Bar

0 Stimmen

Es hat bei mir funktioniert, ich habe nur init .py in jedem Ordner und Erfolg beim Importieren

0 Stimmen

Ich denke, es sollte sein from .dirBar import Bar .

44voto

monkut Punkte 39059

Die einfachste Methode ist die Verwendung von sys.path.append().

Vielleicht interessieren Sie sich aber auch für die imp Modul. Es ermöglicht den Zugriff auf interne Importfunktionen.

# mod_name is the filename without the .py/.pyc extention
py_mod = imp.load_source(mod_name,filename_path) # Loads .py file
py_mod = imp.load_compiled(mod_name,filename_path) # Loads .pyc file 

Dies kann verwendet werden, um Module dynamisch zu laden, wenn Sie den Namen eines Moduls nicht kennen.

Ich habe dies in der Vergangenheit verwendet, um eine Plugin-ähnliche Schnittstelle zu einer Anwendung zu erstellen, bei der der Benutzer ein Skript mit anwendungsspezifischen Funktionen schreibt und sein Skript einfach in einem bestimmten Verzeichnis ablegt.

Auch diese Funktionen können nützlich sein:

imp.find_module(name[, path])
imp.load_module(name, file, pathname, description)

0 Stimmen

Beachten Sie, dass imp.load_source und imp.load_compiled in der Dokumentation als veraltet aufgeführt sind. imp.find_module und imp.load_module werden stattdessen empfohlen.

0 Stimmen

@amicitas, Können Sie bitte eine Referenz für diese (Ich brauche es, und ich bin mit Python 2.6. Ich bin mir bewusst, was 2.7 docs sagen über diese, aber konnte nicht finden, jede Referenz in Bezug auf 2.6)

0 Stimmen

@0xc0de Diese Anweisung finden Sie in den Dokumenten für das imp-Modul für beide python 2.7.3 et python 2.6.7 . Es sieht so aus, als ob diese Funktionen nicht einmal in den Dokumenten für Python 3.2 enthalten sind.

23voto

James Gan Punkte 6408

Der einfachste Weg, ohne Änderungen an Ihrem Skript, ist das Setzen der Umgebungsvariablen PYTHONPATH. Denn sys.path wird von diesen Orten aus initialisiert:

  1. Das Verzeichnis, das das Eingabeskript enthält (oder das aktuelle Verzeichnis).
  2. PYTHONPATH (eine Liste von Verzeichnisnamen, mit der gleichen Syntax wie die Shell-Variable PATH).
  3. Der installationsabhängige Standard.

Laufen Sie einfach:

export PYTHONPATH=/absolute/path/to/your/module

Ihr sys.path enthält den oben genannten Pfad, wie unten gezeigt:

print sys.path

['', '/absolute/path/to/your/module', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']

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.

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