Notez que je ne sais pas quoi faire lors de l'importation de mon propre module avec python
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.
.
├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
.
├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
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
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.
Il y avait deux solutions majeures dans la gamme étudiée.
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
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