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.
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.
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.
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.
[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