Je sais que le mécanisme python ne permet pas de faire des importations relatives sans un package parent connu, mais je veux savoir quelle est la raison.

Si les importations relatives fonctionnaient sans package parent connu, cela rendrait la vie des développeurs beaucoup plus facile (je pense, corrigez-moi si je me trompe)

Exemple:

À partir d'un script python, vous devez importer un fichier de définitions globales. Pour le moment, je dois le faire comme ceci:

DEFS_PATH = '../../../'
sys.path.append(DEFS_PATH)
import DEFINITIONS as defs

Si je pouvais importer ce fichier comme ça sans avoir à spécifier l'indicateur -m lors de l'exécution du script ou de la création d'un fichier __init__.py qui rassemble tous les packages. Cela rendrait tout beaucoup plus facile.

from .... import DEFINITIONS as defs

Bien sûr, cela soulève la célèbre erreur d'importation: import error

Évidemment, ceci est un exemple de jouet, mais imaginez devoir répéter cela dans des centaines de scripts python ...

Existe-t-il une solution de contournement pour l ' importation de packages relatifs sans package parent connu qui n'implique pas la manière la plus horrible (sys.path.append(...) ou python -m myscript)?

0
Ángel 19 févr. 2021 à 21:54

1 réponse

Meilleure réponse

J'ai résolu ce problème mais d'une manière différente. J'ai un dossier dans lequel j'ai beaucoup de fonctions globales que j'ai utilisées dans différents packages, je pourrais créer un package Python de ce dossier, mais je devrais le reconstruire à chaque fois que je changerais quelque chose.

La solution qui me convenait était d'ajouter le fichier user-packages.pth dans le répertoire site-packages de mon environnement actuel, mais il pourrait aussi être ajouté au dossier global site-packages. Dans ce user-packages.pth j'ai ajouté le chemin absolu de mon répertoire où se trouvent tous les utils globaux. Et maintenant, je n'ai plus qu'à faire à partir de n'importe quel script python

from utils import data_processing as dp
from utils.database import database_connection as dc

Maintenant, je n'ai pas besoin d'ajouter dans chaque fichier sys.path.append ("chemin / vers / myutils /")


Remarque:

Le fichier .pth peut avoir n'importe quel nom de fichier (customName.pth) et les chemins dans le fichier doivent être séparés par un retour chariot ("\ n"). En outre, les chemins devraient être absoulte.

Par exemple:

C:\path\to\utils1
C:\path\to\other\utils2
0
Ángel 10 mars 2021 à 09:31