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

3voto

Avenida Gez Punkte 399

Wie Sie bereits erwähnt haben, möchten Sie normalerweise auf einen Ordner mit Ihren Modulen zugreifen können, der relativ zu dem Ordner ist, in dem Ihr Hauptskript ausgeführt wird, so dass Sie sie einfach importieren.

Lösung:

Ich habe das Skript in D:/Books/MyBooks.py und einige Module (wie oldies.py). Ich muss aus dem Unterverzeichnis importieren D:/Books/includes :

import sys,site
site.addsitedir(sys.path[0] + '\\includes')
print (sys.path)  # Just verify it is there
import oldies

Platzieren Sie eine print('done') en oldies.py damit Sie überprüfen können, ob alles in Ordnung ist. Dieser Weg funktioniert immer, denn nach der Python-Definition sys.path wie beim Programmstart initialisiert, das erste Element dieser Liste, path[0] ist das Verzeichnis, das das Skript enthält, mit dem der Python-Interpreter aufgerufen wurde.

Wenn das Skriptverzeichnis nicht verfügbar ist (z. B. wenn der Interpreter interaktiv aufgerufen wird oder wenn das Skript von der Standardeingabe gelesen wird), path[0] ist die leere Zeichenkette, die Python anweist, zuerst die Module im aktuellen Verzeichnis zu suchen. Beachten Sie, dass das Skriptverzeichnis vor den Einträgen eingefügt wird, die als Ergebnis von PYTHONPATH .

1 Stimmen

Ich musste einen Schrägstrich anstelle von zwei Backslashes verwenden (d. h. site.addsitedir(sys.path[0]+'/includes') ) in meinem ersten einfachen Python-Programm break_time.py: https://github.com/ltfschoen/PythonTest . Ich benutze System: MacOS v10.11.5, Python 2.7.12, IDLE IDE 2.7.12, Tk 8.5.9

3voto

Niklas R Punkte 15271

Eine andere Lösung wäre die Installation des py-require Paket und verwenden Sie dann folgendes in Foo.py

import require
Bar = require('./dirBar/Bar')

0 Stimmen

Die URL scheint tatsächlich zu lauten pypi.org/project/require.py und beachten Sie, dass es über Pip installiert werden muss.

2 Stimmen

@FlashSheridan Nein, das ist ein anderes Projekt. Ich habe py-require gelöscht, da ich mir sicher war, dass niemand es benutzt, ich habe aber nicht an diesen Beitrag gedacht. Wenn Sie noch eine require() Funktion, können Sie einen Blick auf mein Node.py-Projekt werfen: github.com/nodepy/nodepy

2voto

0x1996 Punkte 69

Sie können einfach verwenden: from Desktop.filename import something

Exemple :

da die Datei den Namen test.py im Verzeichnis Users/user/Desktop und wird alles importieren.

den Code:

from Desktop.test import *

Stellen Sie aber sicher, dass Sie eine leere Datei mit dem Namen " __init__.py " in diesem Verzeichnis

1 Stimmen

Von Sternimporten wird abgeraten. siehe: stackoverflow.com/questions/2386714/warum-ist-import-schlecht

1 Stimmen

Ich weiß, deshalb habe ich zuerst geschrieben import something Dann sagte ich, um es einfacher zu machen * Grundsätzlich ist es nicht gut für den Ram und auch wenn 2 Funktionen den gleichen Namen haben, wird es Ihren Code überladen

0voto

Justin Muller Punkte 714

Hier ist eine Möglichkeit, eine Datei von einer höheren Ebene zu importieren, indem man den relativen Pfad verwendet.

Verschieben Sie das Arbeitsverzeichnis einfach eine Ebene nach oben (oder an einen beliebigen relativen Ort), fügen Sie es Ihrem Pfad hinzu, und verschieben Sie das Arbeitsverzeichnis dann wieder zurück an seinen Ausgangspunkt.

#to import from one level above:
cwd = os.getcwd()
os.chdir("..")
below_path =  os.getcwd()
sys.path.append(below_path)
os.chdir(cwd)

1 Stimmen

Ich verstehe Ihre Logik nicht. Das ist zu kompliziert.

-1voto

Ich bin nicht erfahren über Python, so dass, wenn es irgendwelche falsch in meine Worte, sagen Sie mir. Wenn Ihre Dateihierarchie wie folgt angeordnet ist:

project\
    module_1.py 
    module_2.py

module_1.py definiert eine Funktion namens func_1() , modul_2.py :

from module_1 import func_1

def func_2():
    func_1()

if __name__ == '__main__':
    func_2()

und Sie laufen python module_2.py in cmd, es wird ausgeführt, was func_1() definiert. Normalerweise importieren wir auf diese Weise gleiche Hierarchiedateien. Aber wenn Sie schreiben from .module_1 import func_1 en module_2.py wird der Python-Interpreter sagen No module named '__main__.module_1'; '__main__' is not a package . Um dies zu beheben, behalten wir einfach die Änderung bei, die wir gerade vorgenommen haben, und verschieben beide Module in ein Paket, und erstellen ein drittes Modul als Aufrufer, um module_2.py .

project\
    package_1\
        module_1.py
        module_2.py
    main.py

main.py :

from package_1.module_2 import func_2

def func_3():
    func_2()

if __name__ == '__main__':
    func_3()

Aber der Grund, warum wir eine . vor module_1 en module_2.py ist, dass wir, wenn wir das nicht tun und main.py wird der Python-Interpreter sagen No module named 'module_1' das ist ein bisschen schwierig, module_1.py ist direkt neben dem module_2.py . Jetzt lasse ich func_1() en module_1.py etwas tun:

def func_1():
    print(__name__)

dass __name__ erfasst, wer func_1 aufruft. Jetzt behalten wir die . vor module_1 , laufen main.py wird folgendes gedruckt package_1.module_1 , nicht module_1 . Es bedeutet, dass derjenige, der anruft func_1() steht auf der gleichen Hierarchieebene wie main.py le . bedeuten, dass module_1 steht auf der gleichen Hierarchieebene wie module_2.py selbst. Wenn also kein Punkt vorhanden ist, main.py wird erkennen module_1 auf derselben Hierarchieebene wie sie selbst, kann sie erkennen package_1 aber nicht das, was "darunter" ist.

Jetzt machen wir es ein bisschen komplizierter. Sie haben eine config.ini und ein Modul definiert eine Funktion, um es in der gleichen Hierarchie wie "main.py" zu lesen.

project\
    package_1\
        module_1.py
        module_2.py
    config.py
    config.ini
    main.py

Und aus irgendeinem unvermeidlichen Grund müssen Sie es mit module_2.py Daher muss es aus der oberen Hierarchie importiert werden. modul_2.py :

 import ..config
 pass

Zwei Punkte bedeuten, dass die Einfuhr aus der oberen Hierarchie erfolgt (drei Punkte bedeuten, dass die Einfuhr aus der oberen Hierarchie erfolgt und so weiter). Jetzt führen wir main.py wird die Dolmetscherin sagen: ValueError:attempted relative import beyond top-level package . Das "Top-Level-Paket" ist hier main.py . Nur weil config.py liegt neben main.py sind sie auf derselben Hierarchieebene angesiedelt, config.py ist nicht "unter" main.py oder es wird nicht "geführt" von main.py so ist es jenseits main.py . Der einfachste Weg, dies zu beheben, ist:

project\
    package_1\
        module_1.py
        module_2.py
    config.py
    config.ini
main.py

Ich denke, dass das mit dem Prinzip der Projektdateihierarchie übereinstimmt, man sollte Module mit verschiedenen Funktionen in verschiedenen Ordnern anordnen, und einfach einen Top-Caller außen vor lassen, und man kann importieren, wie immer man will.

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