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 ?
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.
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
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'
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
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!