TLDR
Cette méthode ne nécessite pas de setuptools, de bidouillages de chemins, d'arguments de ligne de commande supplémentaires ou de spécification du niveau supérieur du paquet dans chaque fichier de votre projet.
Faites simplement un script dans le répertoire parent de ce que vous appelez pour être votre __main__
et tout gérer à partir de là. Pour plus d'explications, continuez à lire.
Explication
Cela peut être réalisé sans avoir à créer un nouveau chemin d'accès, à ajouter des arguments de ligne de commande supplémentaires ou à ajouter du code à chacun de vos programmes pour reconnaître ses frères et sœurs.
La raison de cet échec, comme je crois qu'on l'a déjà mentionné, est que les programmes appelés ont leur __name__
en tant que __main__
. Lorsque cela se produit, le script appelé s'accepte comme étant au niveau supérieur du paquetage et refuse de reconnaître les script dans les répertoires frères.
Cependant, tout ce qui se trouve sous le niveau supérieur du répertoire sera toujours reconnu. TOUT LE MONDE sous le niveau supérieur. Cela signifie que le UNIQUEMENT La chose que vous devez faire pour que les fichiers dans les répertoires frères se reconnaissent/utilisent les uns les autres est de les appeler à partir d'un script dans leur répertoire parent.
Preuve du concept Dans un dir avec la structure suivante :
.
|__Main.py
|
|__Siblings
|
|___sib1
| |
| |__call.py
|
|___sib2
|
|__callsib.py
Main.py
contient le code suivant :
import sib1.call as call
def main():
call.Call()
if __name__ == '__main__':
main()
sib1/call.py contient :
import sib2.callsib as callsib
def Call():
callsib.CallSib()
if __name__ == '__main__':
Call()
et sib2/callsib.py contient :
def CallSib():
print("Got Called")
if __name__ == '__main__':
CallSib()
Si vous reproduisez cet exemple, vous remarquerez que le fait d'appeler Main.py
entraînera l'impression de "Got Called", comme défini dans la section sib2/callsib.py
même si sib2/callsib.py
a été appelé par sib1/call.py
. Cependant, si l'on appelle directement sib1/call.py
(après avoir apporté les modifications appropriées aux importations), une exception est levée. Même s'il a fonctionné lorsqu'il a été appelé par le script dans son répertoire parent, il ne fonctionnera pas s'il croit se trouver au niveau supérieur du paquetage.