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

382voto

ars Points 35803

La façon habituelle de procéder est la suivante.

test1.py

def some_func():
    print 'in test 1, unproductive'

if __name__ == '__main__':
    # test1.py executed as script
    # do something
    some_func()

service.py

import test1

def service_func():
    print 'service func'

if __name__ == '__main__':
    # service.py executed as script
    # do something
    service_func()
    test1.some_func()

73 votes

Et si test1.py se trouve dans un répertoire lointain ?

5 votes

71 votes

Cela ne répond pas vraiment à la question, n'est-ce pas ? Vous n'exécutez pas tout le script, vous exécutez certaines fonctions du script que vous importez.

240voto

balpha Points 18387

Cela est possible dans Python 2 en utilisant

execfile("test2.py")

Voir le documentation pour la gestion des espaces de noms, si cela est important dans votre cas.

En Python 3, cela est possible en utilisant (merci à @fantastory)

exec(open("test2.py").read())

Cependant, vous devriez envisager d'utiliser une approche différente ; votre idée (d'après ce que je peux voir) ne semble pas très propre.

9 votes

Directement ce dont j'ai besoin en python 32 c'est exec(open('test2.py').read())

15 votes

Cette approche exécute les scripts dans l'espace de noms appelant :)

10 votes

Pour passer des arguments de ligne de commande au script, vous pouvez éditer sys.argv liste.

134voto

Dick Goodwin Points 141

Une autre façon :

Fichier test1.py :

print "test1.py"

Fichier service.py :

import subprocess

subprocess.call("test1.py", shell=True)

L'avantage de cette méthode est que vous n'avez pas à modifier un script Python existant pour mettre tout son code dans une sous-routine.

Documentation : Python 2 , Python 3

10 votes

J'ai dû utiliser subprocess.call("./test1.py", shell=True) pour le faire fonctionner

9 votes

Ne pas utiliser shell=True à moins que cela ne soit nécessaire.

5 votes

@PiotrDobrogost - Pourriez-vous préciser quelles situations le rendraient nécessaire ?

43voto

Alex Mapley Points 152
import os

os.system("python myOtherScript.py arg1 arg2 arg3")  

Grâce à l'os, vous pouvez passer des appels directement sur votre terminal. Si vous voulez être encore plus spécifique, vous pouvez concaténer votre chaîne d'entrée avec des variables locales, c'est-à-dire.

command = 'python myOtherScript.py ' + sys.argv[1] + ' ' + sys.argv[2]
os.system(command)

0 votes

Appelle à os.system doit être évitée, vous pouvez faire de même avec n'importe quelle classe de Popen, Call,

4 votes

Desde el Documentation Python : Le module subprocess fournit des moyens plus puissants pour lancer de nouveaux processus et récupérer leurs résultats ; il est préférable d'utiliser ce module plutôt que cette fonction.

33voto

Michael Schneider Points 2001

Si vous voulez que test1.py reste exécutable avec la même fonctionnalité que lorsqu'il est appelé à l'intérieur de service.py, alors faites quelque chose comme :

test1.py

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

if __name__ == "__main__":
    main()

service.py

import test1
# lots of stuff here
test1.main() # do whatever is in test1.py

7 votes

Que se passe-t-il si vous avez des paramètres d'exécution ?

1 votes

sys.argv peut encore être utilisé ici. Et vous pouvez def main(*args) , selon les besoins

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