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