[Wiedereinführung in Python] Importieren über das übergeordnete Verzeichnis

Beachten Sie, dass ich nicht sicher bin, was ich tun soll, wenn ich mein eigenes Modul mit Python importiere

Hintergrund

Wenn Sie programmieren und nicht auf Python beschränkt sind, möchten Sie den in einer Datei beschriebenen Prozess in mehrere Dateien aufteilen. Und dann möchten Sie die geteilten Dateien verwalten, indem Sie sie in Verzeichnisse unterteilen. Es hat einige Zeit gedauert, die zu importierenden Dateien zu importieren, indem sie in diese Verzeichnisse aufgeteilt wurden. Daher werde ich die entsprechende Methode beibehalten.

Obwohl es in Ordnung ist, kann das Muster außerdem in die folgenden zwei unterteilt werden. In diesem Artikel werde ich den einen beschreiben.

  1. Wenn Sie ein Modul in den Pfad über das übergeordnete Verzeichnis in der ausführbaren Datei importieren möchten
.
├package1
│  ├__init__.py
│  └module1.py
└package2
   ├__init__.py
   └module2.py

↑ Wenn die Ausführungsdatei module1.py lautet und Sie module2.py von module1.py aus aufrufen möchten

  1. Wenn Sie ein Modul im Pfad über das übergeordnete Verzeichnis unter den von der ausführbaren Datei importierten Modulen importieren möchten
.
├package1
│  ├__init__.py
│  └module1.py
├package2
│  ├__init__.py
│  └module2.py
└module3.py

↑ Wenn die Ausführungsdatei module3.py lautet, möchte module3.py module1.py importieren, module1.py möchte module2.py importieren

Etwas konkreter

Bis zum Ausschneiden der gemeinsamen Verarbeitung

Wenn Sie eine Funktion mit Python entwickeln, sollten Sie die allgemeine Verarbeitung ausschneiden und modularisieren, wenn die Anzahl der Dateien von 1 Datei auf 2 Dateien und 3 Dateien steigt.

Ausgangszustand

python_import_test
├functionA.py
├functionB.py
└functionC.py

↓ Schneiden Sie die gemeinsame Verarbeitung in eine gemeinsame Verpackung aus

python_import_test
├common
│  ├util.py
│  └__init__.py # <= python3.Nach 3__init__.Kann ohne py importiert werden
├functionA.py
├functionB.py
└functionC.py

Inhalt von common / util.py

common/util.py


import os


def test():
    print("this method is in %s" % os.path.basename(__file__))

Inhalt von functionA.py

functionA.py


from common import util


print("this is %s" % __file__)
util.test()

Lauf

$pwd
/python_import_test

$python functionA.py
this is functionA.py
this method is in util.py

Hauptthema: Ich möchte die Verzeichnisse separat verwalten

Ich glaube, es gibt bisher kein bestimmtes Problem, aber danach erhöht sich die Anzahl der Dateien, und Sie möchten die Verzeichnisse für jede Funktion separat verwalten, wie unten gezeigt.

Vor der Verzeichnisverwaltung

.
├common
│  ├db.py
│  └__init__.py
├functionA_1.py
├functionA_2.py
├functionA_3.py
├functionB_1.py
├functionB_2.py
└functionB_3.py

↓ Nach der Verzeichnisverwaltung

.
├common
│  ├util.py
│  └__init__.py
├functionA
│ ├functionA_1.py
│ ├functionA_2.py
│ └functionA_3.py
└functionB
  ├functionB_1.py
  ├functionB_2.py
  └functionB_3.py

Wenn ich versuche, es auszuführen, indem ich Folgendes schreibe, tritt ein Fehler auf.

functionA/functionA_1.py


from ..common import util

print("this is %s" % __file__)
util.test()
$pwd
/python_import_test/functionA

$python functionA_1.py
Traceback (most recent call last):
  File "functionA_1.py", line 1, in <module>
    from ..common import util
ImportError: attempted relative import with no known parent package

Es scheint, dass Python zur Laufzeit sys, integriertes und main initialisiert, aber beim Initialisieren von main wird das obere Verzeichnis der ausführbaren Datei nicht in den Modul-Suchpfad aufgenommen, also importieren Sie Es scheint, dass Sie nicht in die Suche verwickelt werden, wenn Sie dies tun.

Lösung

Im untersuchten Bereich gab es zwei Hauptlösungen.

  1. Fügen Sie einen Modul-Suchpfad hinzu
  2. Übergeben Sie das übergeordnete Verzeichnis über die Umgebungsvariable PYTHONPATH

1. Fügen Sie den Modul-Suchpfad hinzu

In Python wird der Import in der Reihenfolge der Modulsuche ausgeführt => Laden Der nach dem Modul zu durchsuchende Pfad wird in sys.path gespeichert. Wenn Sie dort also den Pfad des übergeordneten Verzeichnisses hinzufügen, wird der Import normal ausgeführt. Dies scheint jedoch gegen PEP8 zu verstoßen, die Python-Codierungskonvention (da die Konvention erfordert, dass von und der Import oben in der Datei steht), und ich werde wütend, wenn ich ein Grammatikprüfungswerkzeug verwende. (Obwohl es nicht viel ausmacht, weil es funktioniert)

functionA/functionA_1.py


import os
import sys
sys.path.append(os.pardir)
from common import util

print("this is %s" % __file__)
util.test()
$pwd
/python_import_test/functionA

$python functionA_1.py
this is functionA_1.py
this method is in util.py

2. Übergeben Sie das übergeordnete Verzeichnis über die Umgebungsvariable PYTHONPATH

Wenn es Ihnen unangenehm ist, mit sys.path in Ihrer .py-Datei herumzuspielen, gehen Sie wie folgt vor (Ichiou soll die königliche Straße sein) Nur für die lokale Ausführung können Sie es in .bashrc schreiben. Wenn Sie jedoch die .py-Datei im Docker-Container ausführen möchten, müssen Sie sie im Befehl ENV festlegen.

.bashrc

export PYTHONPATH="<python_import_Vollständiger Pfad zum Testen>:$PYTHONPATH"

Dockerfile

ENV PYTHONPATH "<python_import_Vollständiger Pfad zum Testen>:$PYTHONPATH"

functionA/functionA_1.py


from common import util
print("this is %s" % __file__)
util.test()

Das Festlegen von Umgebungsvariablen ist mühsam, daher dachte ich, es wäre, als würde man 2 verwenden, wenn man es starr macht, und ansonsten 1.

Recommended Posts

[Wiedereinführung in Python] Importieren über das übergeordnete Verzeichnis
Wie Sie das aktuelle Verzeichnis in Python in Blender kennen
So erhalten Sie die Python-Version
[Hinweis] Import von Dateien in das übergeordnete Verzeichnis in Python
[Python] Verwendung von import sys sys.argv
Verwendung der C-Bibliothek in Python
[Python] So ändern Sie das Datumsformat (Anzeigeformat)
Zusammenfassung zum Importieren von Dateien in Python 3
[Algorithmus x Python] Verwendung der Liste
So löschen Sie die von Python ausgegebenen Zeichen
So erhalten Sie die Dateien im Ordner [Python]
So installieren Sie Python
So installieren Sie Python
Lesen aller in * .py enthaltenen Klassen in dem von Python angegebenen Verzeichnis
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
[Python] So entfernen Sie doppelte Werte aus der Liste
So rufen Sie den n-ten größten Wert in Python ab
Überlegen Sie, wie Sie Python auf Ihrem iPad programmieren können
So ermitteln Sie die Anzahl der Stellen in Python
[Einführung in Python] Wie iteriere ich mit der Bereichsfunktion?
Verwendung von Raspeye Relay Module Python
[Python] So legen Sie den Download-Speicherort mit youtube-dl fest
[Python] Verwendung der Diagrammerstellungsbibliothek Altair
[Einführung in die Udemy Python3 + -Anwendung] 27. Verwendung des Wörterbuchs
[Einführung in die Udemy Python3 + -Anwendung] 30. Verwendung des Sets
[Python] Zusammenfassung, wie die Farbe der Figur angegeben wird
Verwendung des in Lobe in Python erlernten Modells
[Einführung in Python] Wie stoppe ich die Schleife mit break?
[Python] So schreiben Sie den Tabellenstil mit python-pptx um [python-pptx]
Wie man Python auf Android genießt !! Programmieren für unterwegs !!
[Python] So geben Sie Listenwerte der Reihe nach aus
[Neueste Version 2020.8] So installieren Sie Python
So installieren Sie Python [Windows]
So funktioniert der Import von Python-Modulen
Verwendung des Generators
[Python] Verwendung von Liste 1
So aktualisieren Sie Pythons Tkinter auf 8.6
Wie benutzt man Python Argparse?
Python: Wie man pydub benutzt
[Python] Verwendung von checkio
So führen Sie Notepad ++ Python aus
[Python] Eine andere Möglichkeit zum Importieren
So ändern Sie die Python-Version
Wie man in Python entwickelt
[Python] Wie man Skalar beurteilt
[Python] Verwendung von input ()
Wie benutzt man den Dekorateur?
Wie benutzt man Python Lambda?
[Python] Verwendung von virtualenv
python3: Verwendung der Flasche (3)
python3: Wie man eine Flasche benutzt
So erhöhen Sie die Achse
So starten Sie die erste Projektion
Verwendung von Python-Bytes
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
[Ubuntu] So löschen Sie den gesamten Inhalt des Verzeichnisses
[Python] So überprüfen Sie, ob der Schlüssel im Wörterbuch vorhanden ist
So wechseln Sie die Konfigurationsdatei, die von Python gelesen werden soll