270 votes

Pourquoi Python exécute-t-il mon module lorsque je l'importe, et comment l'arrêter ?

J'ai un programme Python que je suis en train de construire et qui peut être exécuté de deux façons : la première est d'appeler python main.py qui invite l'utilisateur à saisir des données de manière conviviale, puis exécute les données saisies par l'utilisateur dans le programme. L'autre méthode consiste à appeler python batch.py _-file-_ qui passera en revue toutes les entrées amicales et fera passer un fichier entier d'entrées par le programme en une seule fois.

Le problème est que lorsque je lance batch.py il importe certaines variables/méthodes/etc. de main.py et lorsqu'il exécute ce code :

import main

à la première ligne du programme, il se trompe immédiatement parce qu'il essaie d'exécuter le code en main.py .

Comment empêcher Python d'exécuter le code contenu dans le fichier main que j'importe ?

353voto

Parce que c'est ainsi que fonctionne Python, des mots-clés tels que class y def son no déclarations. Au lieu de cela, elles sont en chair et en os qui sont exécutées. Si elles n'étaient pas exécutées, votre module serait vide.

L'approche idiomatique est la suivante :

# stuff to run always here such as class/def
def main():
    pass

if __name__ == "__main__":
   # stuff only to run when not called via 'import' here
   main()

Elle nécessite toutefois le contrôle de la source du module importé.

86voto

Jeremy Banks Points 32470

En raison du fonctionnement de Python, il est nécessaire d'exécuter vos modules lorsqu'il les importe.

Pour éviter que le code du module ne soit exécuté lorsqu'il est importé, mais seulement lorsqu'il est exécuté directement, vous pouvez le protéger avec ceci if :

if __name__ == "__main__":
    # this won't be run when imported

Vous pouvez placer ce code dans un main() afin que vous puissiez soit exécuter le fichier directement, soit importer le module et appeler la méthode main() . Par exemple, supposons que ceci se trouve dans le fichier foo.py .

def main():
    print "Hello World"

if __name__ == "__main__":
    main()

Ce programme peut être exécuté en cliquant sur python foo.py ou d'un autre script :

import foo

...

foo.main()

20voto

Ismail Badawi Points 10898

Utiliser le if __name__ == '__main__' idiome -- __name__ est une variable spéciale dont la valeur est '__main__' si le module est exécuté en tant que script, et le nom du module s'il est importé. Vous pouvez donc faire quelque chose comme

# imports
# class/function definitions
if __name__ == '__main__':
    # code here will only run when you invoke 'python main.py'

6voto

cwallenpoole Points 34940

Malheureusement, ce n'est pas le cas. Cela fait partie du fonctionnement de la syntaxe d'importation et il est important qu'il en soit ainsi -- rappelez-vous def est en fait quelque chose d'exécuté, si Python n'exécutait pas l'importation, vous seriez, eh bien, coincé sans fonctions.

Comme vous avez probablement accès au fichier, vous pourriez être en mesure d'y jeter un coup d'œil et de voir ce qui provoque l'erreur. Il est peut-être possible de modifier votre environnement pour éviter que l'erreur ne se produise.

5voto

Matt Points 11

Placez le code à l'intérieur d'une fonction et il ne s'exécutera pas tant que vous n'aurez pas appelé la fonction. Vous devriez avoir une fonction principale dans votre main.py . avec la déclaration :

if __name__ == '__main__':
  main()

Ensuite, si vous appelez python main.py les main() s'exécutera. Si vous importez main.py Il n'en sera rien. De plus, vous devriez probablement renommer main.py à quelque chose d'autre par souci de clarté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X