Wie importiere ich die Klasse in dasselbe Verzeichnis oder Unterverzeichnis?

675

Ich habe ein Verzeichnis, in dem alle .py- Dateien gespeichert sind.

bin/
   main.py
   user.py # where class User resides
   dir.py # where class Dir resides

Ich möchte Klassen aus user.py und dir.py in main.py verwenden .
Wie kann ich diese Python-Klassen in main.py importieren ?
Wie kann ich außerdem eine Klasse importieren, Userwenn sich user.py in einem Unterverzeichnis befindet?

bin/
    dir.py
    main.py
    usr/
        user.py
Bin Chen
quelle

Antworten:

934

Python 2

Erstellen Sie eine leere Datei, die __init__.pyim selben Verzeichnis wie die Dateien aufgerufen wird . Dies bedeutet für Python, dass der Import aus diesem Verzeichnis in Ordnung ist.

Dann mach einfach ...

from user import User
from dir import Dir

Das Gleiche gilt, wenn sich die Dateien in einem Unterverzeichnis befinden. Fügen Sie auch eine Datei __init__.pyin das Unterverzeichnis ein und verwenden Sie dann reguläre Importanweisungen mit Punktnotation. Für jede Verzeichnisebene müssen Sie dem Importpfad hinzufügen.

bin/
    main.py
    classes/
        user.py
        dir.py

Wenn das Verzeichnis also "Klassen" heißt, würden Sie dies tun:

from classes.user import User
from classes.dir import Dir

Python 3

Wie zuvor, jedoch dem Modulnamen ein Präfix voranstellen, .wenn kein Unterverzeichnis verwendet wird:

from .user import User
from .dir import Dir
Bernstein
quelle
14
Wenn __init__.pyes nicht leer ist, ist alles, was sich darin __init__.pybefindet, verfügbar, wenn Sie das Paket importieren (und Dinge, in die nicht importiert wurde, __init__.pysind überhaupt nicht verfügbar).
Amber
23
Warum wird überhaupt eine __init__.pyDatei benötigt? Wenn ich alle drei Dateien in das gleiche Verzeichnis lege und ausführe main.py, ist es in der Lage, importvon den anderen beiden Modulen ohne es gut. Was vermisse ich?
Martineau
30
Denn so identifiziert Python Verzeichnisse, aus denen Sie importieren dürfen. Das Verzeichnis des Skripts, das Sie ausführen, ist eine Ausnahme - Sie dürfen immer daraus importieren.
Amber
20
@nbro & Amber: FWIW, ich denke, etwas Feines hat sich in Bezug auf __init__.pyandere Module im selben Verzeichnis geändert und kann sie importieren. Insbesondere imports anderer Module im selben Verzeichnis wie die __init__.pyDatei selbst, die in Python 2.7.8 funktioniert hat, sind in Python 3.4.1 fehlgeschlagen. Um das Problem zu beheben, musste ich jedem von ihnen den Namen des Unterverzeichnisses und einen Punkt voranstellen (dh import modulein geändert werden import subdirectory.module). Glücklicherweise funktionierte es danach immer noch in Python 2.7.8.
Martineau
4
Ich kann bestätigen, dass diese Lösung nicht mehr funktioniert. Möglicherweise möchten Sie es korrigieren, ändern oder sofort löschen.
Luís de Sousa
137

Ich habe gerade erfahren (dank Martineaus Kommentar ), dass Sie jetzt in Python 3 schreiben würden, um Klassen aus Dateien im selben Verzeichnis zu importieren:

from .user import User
from .dir import Dir
ecp
quelle
7
Wenn ich dies versuche, nein, bekomme ich den folgenden Fehler, ValueError: Attempted relative import in non-packageaber der Fehler verschwindet, wenn ich zufrom user import User
Korpel
Ich benutze von .fileloader Import Fileloader und bekomme ImportError: Name 'Fileloader' kann nicht importiert werden
Frikster
3
@Korpel: Nach den Diskussionen in stackoverflow.com/questions/11536764/… stelle ich fest, ob der oben angegebene Import funktioniert oder nicht, hängt davon ab: [1] wie Ihr Skript aufgerufen wird (als Paket oder nicht) [2] wo Der eigentliche Arbeitspfad ist, wenn Sie ihn ausführen [3], wie die
Pfadvariable
@Korpel: Mir ist aufgefallen, dass die. vor dem Modulnamen wird nur benötigt, wenn eine init .py-Datei vorhanden ist, wenn nicht die. kann / muss weggelassen werden.
MUG4N
39

In Ihrem main.py:

from user import Class

Wo Classist der Name der Klasse, die Sie importieren möchten?

Wenn Sie eine Methode von aufrufen möchten Class, können Sie sie aufrufen mit:

Class.method

Beachten Sie, dass sich __init__.pyim selben Verzeichnis eine leere Datei befinden sollte .

user225312
quelle
1
Was tun Sie, wenn das zu importierende Modul keine Klassen enthält? Nur rohe Funktionen? In Python 2 musste ich nur das Modul importieren. Funktioniert nicht in Python 3 und 'import .module' auch nicht
Frikster
2
Dies funktioniert in Python3 nach dem Löschen der __init__.py.
Engineforce
13

Sie können das Modul importieren und über seinen Namen darauf zugreifen, wenn Sie Funktionen und Klassen nicht mit Ihren mischen möchten

import util # imports util.py

util.clean()
util.setup(4)

oder Sie können die Funktionen und Klassen in Ihren Code importieren

from util import clean, setup
clean()
setup(4)

Mit wildchar * können Sie alles in diesem Modul in Ihren Code importieren

from util import *
clean()
setup(4)
A. Zaben
quelle
10

In Python3 __init__.pyist dies nicht mehr erforderlich . Wenn das aktuelle Verzeichnis der Konsole das Verzeichnis ist, in dem sich das Python-Skript befindet, funktioniert alles einwandfrei

import user

Dies funktioniert jedoch nicht, wenn es aus einem anderen Verzeichnis aufgerufen wird, das es nicht enthält user.py.
In diesem Fall verwenden

from . import user

Dies funktioniert auch dann, wenn Sie die gesamte Datei anstelle einer Klasse von dort importieren möchten.

lucidbrot
quelle
2
Ich verwende pylint in vs code und hatte Probleme damit, dass ein Import aus demselben Verzeichnis immer als Fehler gekennzeichnet wurde ( import userwurde rot unterstrichen). wurde in den relativen Import ( from . import user) geändert und der Linter hat ihn nicht mehr markiert.
Rbatt
9

Um das Verständnis zu vereinfachen:

Schritt 1: Gehen wir zu einem Verzeichnis, in dem alle enthalten sind

$ cd /var/tmp

Schritt 2: Jetzt erstellen wir eine class1.py-Datei mit dem Klassennamen Class1 und einem Code

$ cat > class1.py <<\EOF
class Class1:
    OKBLUE = '\033[94m'
    ENDC = '\033[0m'
    OK = OKBLUE + "[Class1 OK]: " + ENDC
EOF

Schritt 3: Jetzt erstellen wir eine class2.py-Datei mit dem Klassennamen Class2 und Code

$ cat > class2.py <<\EOF
class Class2:
    OKBLUE = '\033[94m'
    ENDC = '\033[0m'
    OK = OKBLUE + "[Class2 OK]: " + ENDC
EOF

Schritt 4: Jetzt erstellen wir eine main.py, die einmal ausgeführt wird, um Class1 und Class2 aus 2 verschiedenen Dateien zu verwenden

$ cat > main.py <<\EOF
"""this is how we are actually calling class1.py and  from that file loading Class1"""
from class1 import Class1 
"""this is how we are actually calling class2.py and  from that file loading Class2"""
from class2 import Class2

print Class1.OK
print Class2.OK
EOF

Schritt 5: Führen Sie das Programm aus

$ python main.py

Die Ausgabe wäre

[Class1 OK]: 
[Class2 OK]:
Hassan Nadeem
quelle
4
Und was passiert, wenn dies nicht funktioniert und main.py Klasse1 oder Klasse2 nicht lesen kann? ... was fehlt uns?
Darkgaze
6

Python 3


Gleiches directory.

Datei importieren:log.py

Importklasse : SampleApp().

import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()

oder

Verzeichnis ist basic.

in Datei importieren : log.py.

Importklasse : SampleApp().

from basic import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()
Yasith Praharshana
quelle
5
from user import User 
from dir import Dir 
Demas
quelle
Dies funktionierte für mich ohne die Init .py-Datei für Python 2.7 und Python 3.6.
Imsrgadich
1
@imsrgadich funktioniert es, solange Sie Python in dem Verzeichnis ausführen, das die Dateien enthält. Dies ist eine Ausnahme. Siehe diesen Kommentar
Ciprian Tomoiagă
5

Wenn user.py und dir.py keine Klassen enthalten, dann

from .user import User
from .dir import Dir

funktioniert nicht. Sie sollten dann als importieren

from . import user
from . import dir
Andreas Foteas
quelle
0

Ich bin mir nicht sicher, warum das funktioniert, aber ich benutze Pycharm Build from file_in_same_dir import class_name

Die IDE hat sich darüber beschwert, aber es scheint, dass es immer noch funktioniert hat. Ich benutze Python 3.7

stingMantis
quelle
-2

Nur zu kurz: Eine Datei __init__.pyals Klassenverzeichnis erstellen und dann wie folgt in Ihr Skript importieren (Groß- und Kleinschreibung importieren)

from classes.myscript import *

Importieren Sie nur ausgewählte Klassen

from classes.myscript import User
from classes.myscript import Dir
Shafiq
quelle
4
Wildcard-Importe, wie in dieser Antwort gezeigt, werden im Allgemeinen als schlechter Stil angesehen, wie in PEP 8 beschrieben .
V02460
-3

aus demselben Verzeichnis zu importieren

from . import the_file_you_want_to_import 

Zum Importieren aus dem Unterverzeichnis sollte das Verzeichnis enthalten

init .py

Datei andere als Sie Dateien dann

aus dem Verzeichnis importiere deine_Datei

rojo_hlerr
quelle
3
Ich denke nicht, dass diese Antwort etwas hinzufügt, was andere Antworten nicht getan haben, und auch keine umfassende Zusammenfassung der anderen Antworten ist. Also frage ich mich, warum du es geschrieben hast
lucidbrot
-3

Python3

verwenden

from .user import User inside dir.py file

und

use from class.dir import Dir inside main.py
or from class.usr import User inside main.py

wie so

icharis
quelle
3
Diese Antwort fügt nicht wirklich mehr hinzu als die andere Antwort bereits und hat keine Erklärung. Gibt es eine Möglichkeit , Ihre Antwort zu bearbeiten, um sie zu ergänzen oder zu verbessern? Denn ansonsten kann es so abgelehnt werden, als ob diese Antwort vollständig entfernt wurde.
Das_Geek