[PYTHON] tentative d'importation relative au-delà du package de niveau supérieur et comment résoudre en cas de colère

introduction

J'avais peur de l'utiliser dans UnitTest sans y penser avec une importation relative de Python, ou de fouiller un répertoire, mais je pensais qu'il était temps de le résoudre sérieusement, et après l'avoir étudié, j'ai pu le résoudre, donc comme un record Je vais le laisser.

Essayez de reproduire la tentative d'importation relative au-delà du package de niveau supérieur

Avec la structure de répertoires suivante

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

moduleZ.py est moduleX.Lors de l'importation de py, c'est-à-dire moduleZ.Dans le fichier py



```python
from ..subpackage1 import moduleX

Écrire

$ 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

Peut être reproduit en toute sécurité.

Résoudre

Deux solutions ici [1] a offert une très bonne solution Alors je l'ai utilisé. Cette fois

moduleZ.import py



```python
from subpackage1 import moduleX

Réécrire comme

$ pwd
/package
$ python -m subpackage2.moduleZ

Prenez la méthode pour résoudre avec.

-m s'exécute comme un script python en tant que module de bibliothèque. Alors/package dans le répertoire racine(__main__)En tant que sous-paquet2/moduleZ.Puisque py est en cours d'exécution, subpackage1/moduleX.Vous pouvez importer et exécuter py.



## La façon de penser de Python sur l'importation
 Python est [Concept de package](https://www.python.org/doc/essays/packages/) [2] est l'endroit où `` `` python ~~~ .py``` est exécuté `` `root Il reconnaît comme `` `` et reconnaît` `` ~~~ .py``` qui existe sous root en tant que module (`` ~~~ .py```). Un seul script `` `` ~~~ .py``` est reconnu comme cette racine. De plus, lorsque vous exécutez le script avec `` `` python ~~~ .py```, le Python [`` __main__``` est un cas particulier d'importation](https://docs.python.org/ja/3/ reference / import.html # special-Considerations-for-main) [3] force le nom du module à être `` __ main__```. Par conséquent, l'emplacement du répertoire d'exécution est important pour savoir quel script Python est exécuté par root (`` __main__```).
 Dans cet exemple d'échec, root (`` __main__```) sera l'emplacement de `` `` moduleZ.py``` (cette fois `` subpackage2 '') comme indiqué ci-dessous.

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

Par conséquent, lors de l'importation (`subpackage1```) avec une importation relative, en essayant de faire référence à (` / pacakge```) au-dessus de la racine ( `subpackage2```),` ValueError : tentative d'importation relative au-delà du package de niveau supérieur '' et en colère, le script Python ne peut pas être exécuté. À propos, REPL commençant par python a le répertoire actuel de` `` __main__, vous pouvez donc l'importer en l'exécutant dans le répertoire racine. Au contraire, si vous l'exécutez dans un package (répertoire), vous ne pourrez peut-être pas l'importer.

finalement

J'ai utilisé l'importation de Python avec un sentiment mystérieux que je ne comprenais pas, donc j'ai pu l'organiser de manière relative et m'y suis attaché. Je pense que beaucoup de gens sont familiers avec l'utilisation de python -m` '' dans le test unitaire de Python. Si vous avez des malentendus ou des fautes de frappe en raison d'une recherche insuffisante, j'apprécierais que vous puissiez les décrire dans les commentaires. De plus, si vous ne comprenez pas honnêtement l'importation Python dans cet article, je vous serais reconnaissant de bien vouloir consulter les documents de référence.

Matériel de référence

[1] Relative imports for the billionth time [2] Built-in Package Support in Python 1.5 [3] 5.8. Considérations spéciales pour main

Recommended Posts

tentative d'importation relative au-delà du package de niveau supérieur et comment résoudre en cas de colère
Comment empaqueter et distribuer des scripts Python
[Django] Comment résoudre les erreurs lors de l'installation de mysqlclient
[Python] Lorsque vous souhaitez importer et utiliser votre propre package dans le répertoire supérieur
Comment résoudre les conflits de portée variable entre Jinja2 et AngularJS
Comment résoudre la protection CSRF lors de l'utilisation d'AngularJS avec Django
Comment importer des fichiers CSV et TSV dans SQLite avec Python
Comment gérer les erreurs lors de l'installation de whitenoise et du déploiement sur Heroku
Comment gérer les erreurs lors de l'installation de Python et de pip avec choco
[Introduction à Udemy Python3 + Application] 69. Importation du chemin absolu et du chemin relatif
Comment résoudre l'erreur survenue dans toimage (à partir de PIL.Image import fromarray as toimage)