[Python] Was tun, wenn beim Importieren aus dem zu sys.path hinzugefügten Verzeichnis gegen PEP8 verstoßen wird?

Die von mir verwendete Version von Python ist 3.6.

Wenn Sie Fehler finden, wäre ich Ihnen dankbar, wenn Sie in den Kommentaren darauf hinweisen könnten.

Verletzung von PEP8

Angenommen, Sie möchten Ihre eigenen Module unter lib``` aus `scripts / execute.py``` mit einer solchen Verzeichnisstruktur laden.

.
├──scripts
│   └── execute.py
└──lib
    └── my_module.py

Anfangs habe ich versucht, damit umzugehen, indem ich `execute.py``` wie folgt geschrieben und` sys.path``` eine Datei hinzugefügt habe.

import pandas as pd
import sys
sys.path.append('../lib')
import my_module

# (Folgendes wird weggelassen)

Dies ist jedoch die Python-Codierungskonvention PEP8 ([japanische Übersetzung](https: //pep8-ja.readthedocs). io / ja / latest / #)) wird verletzt. Wenn Sie also flake8 usw. verwenden, wird das folgende Tsukkomi eingegeben.

E402 module level import not at top of file

Zitieren wir den relevanten Teil der japanischen Übersetzung.

Platzieren Sie die Importanweisung immer am Anfang der Datei, unmittelbar nach dem Modulkommentar oder der Dokumentzeichenfolge und vor der globalen Variablen- oder Konstantendefinition des Moduls.

Wird durch Setzen der Umgebungsvariablen PYTHONPATH behoben

Nur Ich hatte eine Frage zu Stackoverflow mit demselben Effekt.

Dabei wurden mehrere Methoden beantwortet, und die Methode zum Hinzufügen des Verzeichnisses zur Umgebungsvariablen "PYTHONPATH" schien die wesentliche Lösung zu sein. (Der folgende Link wurde eingeführt)

(Obwohl die folgenden Methoden ebenfalls eingeführt wurden, sieht es für mich ehrlich gesagt wie ein listiger Hack aus.)

Auch die japanische Fragenseite teratail hatte Antworten auf ähnliche Fragen. Die Antwort stammt von Herrn Shimizukawa, einem Sphinx-Committer, und scheint daher sehr glaubwürdig zu sein.

Das Anpassen von sys.path im Skript wird nicht empfohlen. Wenn das Verzeichnis, in dem Sie die Bibliothek verwenden möchten, an verschiedenen Stellen festgelegt ist und Sie diese Bibliothek importieren möchten, können Sie die Umgebungsvariable PYTHONPATH festlegen.

Also habe ich das Verzeichnis `lib``` zu PYTHONPATH hinzugefügt und mich damit befasst. Wenn Sie es jedes Mal verwenden, schreiben Sie es in `bash_profile```.

export PYTHONPATH="${PYTHONPATH}:/vollständiger Pfad des lib-Verzeichnisses/lib"

Dies ermöglichte es uns, die zugehörige Beschreibung von `sys.path``` aus` execute.py``` zu entfernen.

import pandas as pd

import my_module

# (Folgendes wird weggelassen)

Informationen zur Umgebungsvariablen PYTHONPATH

Es ist nicht das Hauptthema, aber ich war gespannt, was passieren würde, wenn der Bibliotheksname und mein eigener Modulname schlagen würden.

Lesen Sie in diesem Fall das offizielle Dokument. Es gibt die folgende Beschreibung im offiziellen Python-Tutorial.

Beim Importieren eines Moduls mit dem Namen Spam sucht der Interpreter zunächst nach einem integrierten Modul mit diesem Namen. Wenn nicht gefunden, suchen Sie in der Liste der Verzeichnisse in sys.path nach einer Datei mit dem Namen spam.py. sys.path wird an folgendem Speicherort initialisiert:

  • Das Verzeichnis, das das eingegebene Skript enthält (oder das aktuelle Verzeichnis, wenn keine Datei angegeben ist).

Anscheinend hat der in PYTHONPATH Vorrang. Selbst als ich es tatsächlich versuchte, verhielt es sich so.

Recommended Posts

[Python] Was tun, wenn beim Importieren aus dem zu sys.path hinzugefügten Verzeichnis gegen PEP8 verstoßen wird?
Was tun, wenn der Werttyp in Python nicht eindeutig ist?
Was tun, wenn der Fortschrittsbalken in tqdm von Python nicht angezeigt wird?
Was tun, wenn in der Anaconda-Umgebung die Warnung "Die Umgebung ist konsistent ..." angezeigt wird
Was tun, wenn Sie "locale.Error: nicht unterstützte Gebietsschemaeinstellung" erhalten, wenn Sie den Tag vom Datum in Python abrufen?
Was tun, wenn [Errno 2] in Python keine solche Datei oder kein solches Verzeichnis angezeigt wird?
Um das Äquivalent von Rubys ObjectSpace._id2ref in Python zu tun
Was zu tun ist, wenn es nicht in der Sudoers-Datei enthalten ist. Dieser Vorfall wird gemeldet.
Was tun, wenn nur das Fenster angezeigt wird und im Pygame nichts angezeigt wird?
Was tun, wenn beim Importieren von matplotlib in Python (Mac) eine Fehlermeldung angezeigt wird?
Was tun, wenn Python in pyenv nicht von der Systemversion wechselt?
Was tun, wenn in Python "SSL: CERTIFICATE_VERIFY_FAILED _ssl.c: 1056" angezeigt wird?
Was tun, wenn "Unbenannt: 0" in_csv-> read_csv von Pandas hinzugefügt wird?
Was tun, wenn ModuleNotFoundError: In Python tritt kein Modul mit dem Namen 'XXX' auf
Schreiben Sie ein Skript in Shell und Python, um Sie in Slack zu benachrichtigen, wenn der Vorgang abgeschlossen ist
Was tun, wenn ein Teil des Hintergrundbilds transparent wird, wenn Sie transparente Bilder mit Pillow kombinieren?
NameError: Der globale Name'dot_parser 'ist nicht definiert und was ist zu tun, wenn er in Python angezeigt wird?
Was ist "Mahjong" in der Python-Bibliothek? ??
Was tun, wenn in python json .dumps eine Dezimalstelle enthalten ist?
[Python] Was tun, wenn ein Fehler im Zusammenhang mit der SSL-Authentifizierung zurückgegeben wird?
Was für ein Buch ist der meistverkaufte "Python Crash Course" der Welt?
[Einführung in Python] Wie wird mit der continue-Anweisung wiederholt?
Was tun, wenn eine Warnmeldung in der Pip-Liste angezeigt wird?
Was ist zu tun, wenn "Etwas läuft bereits an Port 8000" angezeigt wird, wenn der Entwicklungsbefehl von Gatsby ausgeführt wird.
So schreiben Sie, was zu tun ist, wenn die Anwendung zum ersten Mal in Qt for Python mit Designer angezeigt wird
Beispiel, was zu tun ist, wenn das Beispielskript nicht funktioniert (OpenCV-Python)
Was ist im Docker Python-Image pfeifend?
Was tun, wenn eine Warnung zur Python-Integration in Neovims CheckHealth angezeigt wird?
Was tun, wenn der Fehler RuntimeError angezeigt wird: Python wird nicht als Framework installiert, wenn Sie versuchen, matplitlib und pylab in Python 3.3 zu verwenden
Was tun, wenn ein PermissionError in tempfile.mkstemp auftritt?
Was tun, wenn bei der Eingabe eines Kameravideos in OpenCV ein Abbruch angezeigt wird?
Was ich beim Update von Python 2.6 auf 2.7 gemacht habe
Was tun, wenn das Diagramm nicht auf dem Jupyter-Notizbuch (Ipython) angezeigt wird?
Was tun, um eine Google-Tabelle in Python zu erhalten?
Was tun, wenn (Basis) am Anfang des Mac-Terminals angezeigt wird?
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
[Python] Typ Fehler: 'WebElement'-Objekt ist nicht iterierbar Was tun, wenn ein Fehler auftritt?
[Python] Was tun, wenn beim Erstellen von Exe mit PyInstaller kein Modul mit dem Namen "pyproj.datadir" angezeigt wird?
Was tun, wenn der Druckbefehl selbst einen Fehler in Mayas Python verursacht?
Was tun, wenn Pythons IntelliSense in VS Code unter Windows nicht angezeigt wird?
So überprüfen Sie in Python, ob sich eines der Elemente einer Liste in einer anderen Liste befindet
[Einführung in Python] Was ist das wichtige "if __name__ == '__ main__':" beim Umgang mit Modulen?
Was beim Nachahmen zu tun ist, wird in Python eingebettet
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
[Go 1.13] Was tun, wenn ein unerwartetes Verzeichnislayout angezeigt wird?
[openpyxl] Was tun, wenn IllegalCharacterError in pandas.DataFrame.to_excel angezeigt wird?
curl: (60) Was tun, wenn das Ausstellerzertifikat ungültig ist?
So ermitteln Sie die Anzahl der Stellen in Python
Wie Sie das aktuelle Verzeichnis in Python in Blender kennen
Suchen Sie den Teil 575 aus Wikipedia in Python
Was tun, wenn "Name xxx nicht importiert werden kann" [Python]
Ich möchte am Ende etwas mit Python machen
Notieren Sie sich, was Sie in Zukunft mit Razpai machen möchten