[PYTHON] Versuch eines relativen Imports über das Top-Level-Paket hinaus und wie man es löst, wenn man wütend ist

Einführung

Ich hatte Angst, es in UnitTest zu verwenden, ohne beim relativen Import von Python darüber nachzudenken oder ein Verzeichnis zu durchsuchen, aber ich dachte, es sei Zeit, es ernsthaft zu lösen, und nachdem ich es untersucht hatte, konnte ich es lösen, also als Aufzeichnung Ich werde es verlassen.

Versuchen Sie, den versuchten relativen Import über das Paket der obersten Ebene hinaus zu reproduzieren

Mit folgender Verzeichnisstruktur

/package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py

moduleZ.py ist moduleX.Beim Importieren von py, dh moduleZ.In der py-Datei



```python
from ..subpackage1 import moduleX

Schreiben

$ pwd 
/package
$ cd subpackage2
$ python moduleZ.py
ValueError: attempted relative import beyond top-level package

## or
$ python subpackage2/moduleZ.py
ValueError: attempted relative import beyond top-level package

Kann sicher reproduziert werden.

Lösen

Zwei Lösungen hier [1] bot eine sehr gute Lösung Also habe ich es benutzt. Diesmal

moduleZ.py importieren



```python
from subpackage1 import moduleX

Umschreiben als

$ pwd
/package
$ python -m subpackage2.moduleZ

Nehmen Sie die Methode, um mit zu lösen.

-m wird als Python-Skript als Bibliotheksmodul ausgeführt. Damit/Paket zum Stammverzeichnis(__main__)Als Unterpaket2/moduleZ.Da py läuft, subpackage1/moduleX.Sie können py importieren und ausführen.



## Pythons Denkweise über Import
 Python ist [Paketkonzept](https://www.python.org/doc/essays/packages/) [2] ist der Ort, an dem `` `Python ~~~ .py``` ausgeführt wird` `` root Es erkennt als `` `und erkennt`` ~~~ .py```, das unter root als Modul existiert (`` ~~~ .py```). Nur ein `` `~~~ .py``` Skript wird als diese Wurzel erkannt. Wenn Sie das Skript mit `` `python ~~~ .py``` ausführen, ist Python [` `__main__``` ein Sonderfall des Imports](https://docs.python.org/ja/3/ reference / import.html # special-Considerations-for-main) [3] erzwingt, dass der Modulname `` `__ main__``` lautet. Daher ist der Speicherort des Ausführungsverzeichnisses wichtig, welches Python-Skript von root ausgeführt wird (`` __main__```).
 In diesem Fehlerbeispiel ist root (`` __main__```) der Speicherort von `` `moduleZ.py``` (diesmal` `` subpackage2```), wie unten gezeigt.

```bash
$ pwd 
/package
$ cd subpackage2
$ python moduleZ.py
## or
python subpackage2/moduleZ.py

Wenn Sie (`subpackage1```) mit relativem Import importieren und versuchen, auf (` / pacakge) über root (`` `subpackage2) zu verweisen,`` ValueError : Relativer Import über das Top-Level-Paket``` hinaus versucht und wütend, Python-Skript kann nicht ausgeführt werden. Übrigens hat REPL, beginnend mit ``python, das aktuelle Verzeichnis von` `__main__, sodass Sie es importieren können, indem Sie es im Stammverzeichnis ausführen. Im Gegenteil, wenn Sie es in einem Paket (Verzeichnis) ausführen, können Sie es möglicherweise nicht importieren.

Schließlich

Ich benutzte Pythons Import mit einem mysteriösen Gefühl, das ich nicht verstand, also konnte ich ihn relativ organisieren und wurde daran gebunden. Ich denke, viele Leute sind mit der Verwendung von `python -m `in Pythons Unit Test vertraut. Wenn Sie aufgrund mangelnder Forschung Missverständnisse oder Tippfehler haben, würde ich mich freuen, wenn Sie diese in den Kommentaren beschreiben könnten. Wenn Sie den Python-Import in diesem Artikel nicht ehrlich verstehen, wäre ich Ihnen dankbar, wenn Sie sich die Referenzmaterialien ansehen könnten.

Referenzmaterial

[1] Relative imports for the billionth time [2] Built-in Package Support in Python 1.5 [3] 5.8. Besondere Überlegungen für main

Recommended Posts

Versuch eines relativen Imports über das Top-Level-Paket hinaus und wie man es löst, wenn man wütend ist
So verpacken und verteilen Sie Python-Skripte
[Django] So beheben Sie Fehler bei der Installation von mysqlclient
[Python] Wenn Sie Ihr eigenes Paket im oberen Verzeichnis importieren und verwenden möchten
So lösen Sie Konflikte mit variablen Bereichen zwischen Jinja2 und AngularJS
So lösen Sie den CSRF-Schutz bei Verwendung von AngularJS mit Django
So importieren Sie CSV- und TSV-Dateien mit Python in SQLite
Umgang mit Fehlern bei der Installation von Whitenoise und der Bereitstellung auf Heroku
Umgang mit Fehlern bei der Installation von Python und Pip mit Choco
[Einführung in die Udemy Python3 + -Anwendung] 69. Import des absoluten Pfads und des relativen Pfads
So beheben Sie den Fehler, der in toimage aufgetreten ist (aus PIL.Image Import fromarray als toimage)