[Réintroduction à python] Comment importer via le répertoire parent

Notez que je ne sais pas quoi faire lors de l'importation de mon propre module avec python

Contexte

Si vous programmez, sans vous limiter à python, vous voudrez diviser le processus décrit dans un fichier en plusieurs fichiers. Et puis vous voulez gérer les fichiers divisés en les divisant en répertoires. Il a fallu un certain temps pour importer les fichiers qui ont commencé à être gérés en les divisant dans ces répertoires, je vais donc laisser la méthode correspondante.

De plus, bien que ce soit bien, le motif peut être divisé en deux. Dans cet article, je décrirai celui-ci.

  1. Si vous souhaitez importer un module dans le chemin via le répertoire parent dans le fichier exécutable
.
├package1
│  ├__init__.py
│  └module1.py
└package2
   ├__init__.py
   └module2.py

↑ Lorsque le fichier d'exécution est module1.py et que vous souhaitez appeler module2.py depuis module1.py

  1. Si vous souhaitez importer un module dans le chemin via le répertoire parent parmi les modules importés par le fichier exécutable
.
├package1
│  ├__init__.py
│  └module1.py
├package2
│  ├__init__.py
│  └module2.py
└module3.py

↑ Lorsque le fichier d'exécution est module3.py, module3.py veut importer module1.py, module1.py veut importer module2.py

Un peu plus de béton

Jusqu'à la suppression du traitement commun

Lors du développement d'une fonction avec python, vous voudrez supprimer le traitement courant et le modulariser à mesure que le nombre de fichiers augmente de 1 fichier à 2 fichiers et 3 fichiers.

Etat initial

python_import_test
├functionA.py
├functionB.py
└functionC.py

↓ Découpez le traitement commun dans un package commun

python_import_test
├common
│  ├util.py
│  └__init__.py # <= python3.Après 3__init__.Peut être importé sans py
├functionA.py
├functionB.py
└functionC.py

Contenu de common / util.py

common/util.py


import os


def test():
    print("this method is in %s" % os.path.basename(__file__))

Contenu de functionA.py

functionA.py


from common import util


print("this is %s" % __file__)
util.test()

Courir

$pwd
/python_import_test

$python functionA.py
this is functionA.py
this method is in util.py

Sujet principal: je souhaite gérer les répertoires séparément

Je ne pense pas qu'il y ait de problème particulier jusqu'à présent, mais après cela, le nombre de fichiers augmentera et vous voudrez gérer les répertoires séparément pour chaque fonction comme indiqué ci-dessous.

Avant la gestion des répertoires

.
├common
│  ├db.py
│  └__init__.py
├functionA_1.py
├functionA_2.py
├functionA_3.py
├functionB_1.py
├functionB_2.py
└functionB_3.py

↓ Après la gestion des répertoires

.
├common
│  ├util.py
│  └__init__.py
├functionA
│ ├functionA_1.py
│ ├functionA_2.py
│ └functionA_3.py
└functionB
  ├functionB_1.py
  ├functionB_2.py
  └functionB_3.py

Lorsque j'essaye de l'exécuter en écrivant ce qui suit, une erreur se produit.

functionA/functionA_1.py


from ..common import util

print("this is %s" % __file__)
util.test()
$pwd
/python_import_test/functionA

$python functionA_1.py
Traceback (most recent call last):
  File "functionA_1.py", line 1, in <module>
    from ..common import util
ImportError: attempted relative import with no known parent package

Il semble que python initialise sys, intégré et main lors de l'exécution, mais lors de l'initialisation de main, le répertoire supérieur du fichier exécutable n'est pas inclus dans le chemin de recherche du module, alors importez Il semble que vous ne serez pas pris dans la recherche lorsque vous le faites.

Solution

Il y avait deux solutions majeures dans la gamme étudiée.

  1. Ajoutez un chemin de recherche de module
  2. Passez le répertoire parent via la variable d'environnement PYTHONPATH

1. Ajouter le chemin de recherche du module

En python, l'importation est exécutée dans l'ordre du module search => load Le chemin à rechercher pour le module est stocké dans sys.path, donc si vous y ajoutez le chemin du répertoire parent, l'importation sera exécutée normalement. Cependant, cela semble enfreindre PEP8, la convention de codage Python (car la convention exige que from et import soient en haut du fichier), et je me fâche lorsque j'utilise un outil de vérification grammaticale. (Même si cela n'a pas beaucoup d'importance car cela fonctionne)

functionA/functionA_1.py


import os
import sys
sys.path.append(os.pardir)
from common import util

print("this is %s" % __file__)
util.test()
$pwd
/python_import_test/functionA

$python functionA_1.py
this is functionA_1.py
this method is in util.py

2. Passez le répertoire parent via la variable d'environnement PYTHONPATH

Si vous trouvez difficile de jouer avec sys.path dans votre fichier .py, voici comment le faire (Ichiou est censé être la route royale) Pour une exécution locale uniquement, vous pouvez l'écrire dans .bashrc, mais si vous souhaitez exécuter le fichier .py dans le conteneur Docker, vous devez le définir dans la commande ENV.

.bashrc

export PYTHONPATH="<python_import_Chemin d'accès complet au test>:$PYTHONPATH"

Dockerfile

ENV PYTHONPATH "<python_import_Chemin d'accès complet au test>:$PYTHONPATH"

functionA/functionA_1.py


from common import util
print("this is %s" % __file__)
util.test()

Définir des variables d'environnement est un problème, j'ai donc pensé que ce serait comme utiliser 2 pour le rendre rigide, et 1 sinon.

Recommended Posts

[Réintroduction à python] Comment importer via le répertoire parent
Comment connaître le répertoire actuel en Python dans Blender
Comment obtenir la version Python
[Note] Importation de fichiers dans le répertoire parent en Python
[Python] Comment utiliser import sys sys.argv
Comment utiliser la bibliothèque C en Python
[Python] Comment changer le format de la date (format d'affichage)
Résumé de la façon d'importer des fichiers dans Python 3
[Algorithm x Python] Comment utiliser la liste
Comment effacer les caractères générés par Python
Comment obtenir les fichiers dans le dossier [Python]
Comment installer Python
Comment installer python
Comment lire toutes les classes contenues dans * .py dans le répertoire spécifié par Python
Comment obtenir une liste de fichiers dans le même répertoire avec python
[Python] Comment supprimer les valeurs en double de la liste
Comment récupérer la nième plus grande valeur en Python
Réfléchissez à la programmation de Python sur votre iPad
Comment obtenir le nombre de chiffres en Python
[Introduction à Python] Comment itérer avec la fonction range?
Comment utiliser Raspeye Relay Module Python
[Python] Comment spécifier l'emplacement de téléchargement avec youtube-dl
[Python] Comment utiliser la bibliothèque de création de graphes Altair
[Introduction à Udemy Python3 + Application] 27. Comment utiliser le dictionnaire
[Introduction à Udemy Python3 + Application] 30. Comment utiliser l'ensemble
[Python] Résumé de la façon de spécifier la couleur de la figure
Comment utiliser le modèle appris dans Lobe en Python
[Introduction à Python] Comment arrêter la boucle en utilisant break?
[Python] Comment réécrire le style de table avec python-pptx [python-pptx]
Comment profiter de Python sur Android !! Programmation en déplacement !!
[Python] Comment afficher les valeurs de liste dans l'ordre
[2020.8 dernière] Comment installer Python
Comment installer Python [Windows]
Fonctionnement de l'importation de modules Python
Comment utiliser le générateur
[Python] Comment utiliser la liste 1
Comment mettre à jour Tkinter de Python vers la version 8.6
Comment utiliser Python Argparse
Python: comment utiliser pydub
[Python] Comment utiliser checkio
Comment exécuter Notepad ++ Python
[Python] Une autre façon d'importer
Comment changer la version de Python
Comment développer en Python
[python] Comment juger scalaire
[Python] Comment utiliser input ()
Comment utiliser le décorateur
Comment utiliser Python lambda
[Python] Comment utiliser virtualenv
python3: Comment utiliser la bouteille (3)
python3: Comment utiliser la bouteille
Comment augmenter l'axe
Comment démarrer la première projection
Comment utiliser les octets Python
J'ai essayé de simuler la propagation de l'infection avec Python
[Ubuntu] Comment supprimer tout le contenu du répertoire
[python] Comment vérifier si la clé existe dans le dictionnaire
Comment changer le fichier de configuration pour qu'il soit lu par Python