488 votes

Quelle est la meilleure façon d'appeler un script depuis un autre script ?

J'ai un script nommé test1.py qui n'est pas dans un module. Il contient juste du code qui devrait s'exécuter lorsque le script lui-même est exécuté. Il n'y a pas de fonctions, de classes, de méthodes, etc. J'ai un autre script qui fonctionne comme un service. Je veux appeler test1.py à partir du script exécuté comme un service.

Par exemple :

Fichier test1.py :

print "I am a test"
print "see! I do nothing productive."

Fichier service.py :

# Lots of stuff here
test1.py # do whatever is in test1.py

Je connais une méthode qui consiste à ouvrir le fichier, à lire son contenu et, en gros, à l'évaluer. Je suppose qu'il y a une meilleure façon de le faire. Ou du moins je l'espère.

62 votes

La meilleure solution consiste à écrire des méthodes et des classes et à les utiliser

0 votes

Voir cette réponse : stackoverflow.com/a/71967141/1364242

32voto

Flavio Points 67

Je préfère runpy :

#!/usr/bin/env python
# coding: utf-8

import runpy

runpy.run_path(path_name='script-01.py')
runpy.run_path(path_name='script-02.py')
runpy.run_path(path_name='script-03.py')

15voto

thedz Points 3494

Vous ne devriez pas faire ça. A la place, faites-le :

test1.py :

 def print_test():
      print "I am a test"
      print "see! I do nothing productive."

service.py

#near the top
from test1 import print_test
#lots of stuff here
print_test()

4 votes

Lorsque vous importez test1, comment sait-il où se trouve le fichier ? doit-il se trouver dans le même répertoire ? et si ce n'est pas le cas ?

12voto

gimel Points 30150

Utilice import test1 pour la 1ère utilisation - il exécutera le script. Pour les invocations ultérieures, traitez le script comme un module importé, et appelez la commande reload(test1) méthode.

Quand reload(module) est exécuté :

  • Le code des modules Python est recompilé et l'option code de niveau module ré-exécuté Il définit un nouvel ensemble d'objets qui sont liés à des noms dans le dictionnaire du module. La fonction init des modules d'extension n'est pas appelée

Une simple vérification de sys.modules peut être utilisé pour invoquer l'action appropriée. Pour continuer à se référer au nom du script comme une chaîne de caractères ( 'test1' ), utilisez le ' import ()' builtin.

import sys
if sys.modules.has_key['test1']:
    reload(sys.modules['test1'])
else:
    __import__('test1')

3 votes

reload a disparu dans Python 3.

3 votes

L'importation d'un module n'équivaut pas à son exécution. if __name__ == "__main__": garde. Il peut y avoir d'autres différences plus subtiles. Ne laissez pas de code arbitraire au niveau global. Mettez-le dans une fonction et appelez-la après l'importation, comme le suggère le document réponse acceptée au lieu de

6voto

Anurag Uniyal Points 31931

Pourquoi ne pas simplement importer test1 ? Chaque script de python est un module. Un meilleur moyen serait d'avoir une fonction par exemple main/run dans test1.py, d'importer test1 et d'exécuter test1.main(). Ou vous pouvez exécuter test1.py comme un sous-processus.

0 votes

Supposons que j'utilise import test1 parce que je veux .py pour compiler en .pyc pour la prochaine fois. Comment lui transmettre mes paramètres ? La fonction main() sera-t-elle exécutée automatiquement ou dois-je y faire quelque chose de spécial ?

6voto

Chao Chen Points 51

Comme cela a déjà été mentionné, runpy est une façon agréable d'exécuter d'autres scripts ou modules à partir du scripts actuel.

À propos, il est assez courant qu'un traceur ou un débogueur fasse cela, et dans de telles circonstances, des méthodes comme l'importation directe du fichier ou l'exécution du fichier dans un sous-processus ne fonctionnent généralement pas.

Il faut également veiller à utiliser exec pour exécuter le code. Vous devez fournir run_globals pour éviter une erreur d'importation ou d'autres problèmes. Se référer à runpy._run_code pour les détails.

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