Beachten Sie, dass ich nicht sicher bin, was ich tun soll, wenn ich mein eigenes Modul mit Python importiere
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.
.
├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
.
├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
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
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.
Im untersuchten Bereich gab es zwei Hauptlösungen.
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
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