Maison >développement back-end >Tutoriel Python >Comment gérer les importations relatives dans les packages Python lors de l'exécution de modules en tant que scripts ?

Comment gérer les importations relatives dans les packages Python lors de l'exécution de modules en tant que scripts ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-29 15:25:11814parcourir

How to Handle Relative Imports in Python Packages When Running Modules as Scripts?

Importations relatives dans Python 3

Lorsque vous tentez d'importer une fonction à partir d'un autre fichier dans le même répertoire, en utilisant soit from .mymodule import myfunction ou from mymodule import myfunction peut entraîner des erreurs. La raison réside dans le fait que le module contenant la fonction importée se trouve ou non dans un package.

Utilisation des importations relatives

Les importations relatives fonctionnent lorsque le module est à l'intérieur d'un package. Pour créer un package, un fichier __init__.py doit être présent dans le répertoire contenant les modules. Cependant, il est également important de s'assurer que le module peut parfois être exécuté en tant que script.

Structure du code

Une présentation courante pour un package contenant plusieurs modules et un script principal est la suivante suit :

  • main.py
  • mypackage/

    • __init__. py
    • mymodule.py
    • myothermodule.py

Dans mymodule.py :

# Exported function
def as_int(a):
    return int(a)

# Test function for module  
def _test():
    assert as_int('1') == 1

if __name__ == '__main__':
    _test()

Dans myothermodule.py :

# Import exported function from the mymodule
from .mymodule import as_int

# Exported function
def add(a, b):
    return as_int(a) + as_int(b)

# Test function for module  
def _test():
    assert add('1', '1') == 2

if __name__ == '__main__':
    _test()

Dans main.py :

# Import exported function from myothermodule
from mypackage.myothermodule import add

def main():
    print(add('1', '1'))

if __name__ == '__main__':
    main()

Exécution du code

Lors de l'exécution de main.py ou mypackage/mymodule.py, le code s'exécute sans problème. Cependant, tenter d'exécuter mypackage/myothermodule.py entraîne une erreur liée à l'importation relative utilisée (à partir de .mymodule import as_int).

Approches alternatives

Il existe deux approches alternatives pour résoudre ce problème. :

  1. Utiliser les importations absolues : Remplacez l'importation relative par une importation absolue en spécifiant le chemin complet du module : depuis mypackage.mymodule import as_int. Cependant, cela nécessite que le répertoire parent du package soit ajouté au PYTHONPATH.
  2. Utilisez l'option -m : Pour éviter d'utiliser des importations absolues tout en garantissant que le module fonctionne correctement, utilisez le - Option m avec Python : python3 -m monpackage.myothermodule. Cette approche nécessite d'exécuter la commande à partir du répertoire parent du package.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn