Maison >développement back-end >Tutoriel Python >Comment puis-je éviter les piratages de « sys.path » lors de l'importation de packages frères et sœurs en Python ?

Comment puis-je éviter les piratages de « sys.path » lors de l'importation de packages frères et sœurs en Python ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-11 13:56:10135parcourir

How Can I Avoid `sys.path` Hacks When Importing Sibling Packages in Python?

Importations de packages frères et sœurs : une approche indolore

Lorsque vous traitez des importations Python, rencontrer des problèmes d'importation de packages frères et sœurs peut être frustrant. Explorons une alternative au redoutable hack sys.path.insert pour résoudre ce problème.

Configuration du projet

Considérez la structure de projet suivante :

├── LICENSE.md
├── README.md
├── api
│   ├── __init__.py
│   ├── api.py
│   └── api_key.py
├── examples
│   ├── __init__.py
│   ├── example_one.py
│   └── example_two.py
└── tests
│   ├── __init__.py
│   └── test_one.py

Le Problème

Lorsque vous essayez d'importer depuis le module API dans les répertoires d'exemples et de tests, vous pouvez rencontrer une erreur du type :

ModuleNotFoundError: No module named 'api'

La solution< /h2>

Au lieu de recourir aux hacks sys.path, voici un Pythonic solution :

Étape 1 : Créer un fichier pyproject.toml

[project]
name = "myproject"
version = "0.1.0"
description = "My small project"

[build-system]
requires = ["flit_core >=3.2,<4"]
build-backend = "flit_core.buildapi"

Étape 2 : Installer avec pip -e

Activez votre environnement virtuel si besoin, puis installez votre projet en modifiable state :

pip install -e .

Étape 3 : Ajuster les importations

Modifier les importations dans les fichiers qui ne pouvaient auparavant pas être importés depuis le module API pour inclure le nom du projet, par exemple :

from myproject.api.api import function_from_api

Exemple

a pi.py

def function_from_api():
    return 'I am the return value from api.api!'

test_one.py

from myproject.api.api import function_from_api

def test_function():
    print(function_from_api())

if __name__ == '__main__':
    test_function()

En cours d'exécution le test

Assurez-vous que vous êtes toujours dans votre environnement virtuel et exécutez ce qui suit :

python .\myproject\tests\test_one.py

Sortie :

I am the return value from api.api!

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