J'ai un script nommé test1.py qui n'est pas dans un module. Il a juste du code qui devrait s'exécuter lorsque le script lui-même est exécuté. Il n'y a pas de fonctions, classes, méthodes, etc. J'ai un autre script qui fonctionne comme un service. Je veux appeler test1.py à partir du script exécuté en tant que service.
Par exemple:
Fichier test1.py
print "I am a test"
print "see! I do nothing productive."
File service.py
# Lots of stuff here
test1.py # do whatever is in test1.py
Je connais une méthode qui ouvre le fichier, lit le contenu et l'évalue. Je suppose qu'il existe une meilleure façon de procéder. Ou du moins je l'espère.
runpy.run_module
réponse?!Réponses:
La façon habituelle de procéder est quelque chose comme ce qui suit.
test1.py
service.py
la source
test1.py
se trouve dans un répertoire éloigné?import test1
inservice.py
exécute en effet tout le script (qui ne définit quesome_func()
puisque le__name__ == '__main__'
seraFalse
dans ce cas). Cela ressemble à tout ce que l'OP veut faire. Cette réponse va au-delà de cela, mais répond certainement à la question - et puis à certains.test1.py
ne contenait pas la définition de la fonctionsome_func()
(mais plutôt juste quelques lignes de code, par exempleprint("hello")
) alors votre code ne fonctionnerait pas. Dans cet exemple particulier, cela fonctionne parce que vous importez essentiellement une fonction externe que vous rappelez ensuite.Ceci est possible dans Python 2 en utilisant
Consultez la documentation pour la gestion des espaces de noms, si cela est important dans votre cas.
En Python 3, cela est possible en utilisant (grâce à @fantastory)
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.
la source
sys.argv
liste.Autrement:
Fichier test1.py:
Fichier service.py:
L'avantage de cette méthode est que vous n'avez pas à modifier un script Python existant pour mettre tout son code dans un sous-programme.
Documentation: Python 2 , Python 3
la source
subprocess.call("./test1.py", shell=True)
pour le faire fonctionnershell=True
sauf si cela est nécessaire.test1.py
doit être exécutable et avoir la ligne shebang (#!/usr/bin/env python
) et vous devez spécifier le chemin complet ou vous devez fournir l'exécutable vous-même:call([sys.executable, os.path.join(get_script_dir(), 'test1.py')])
oùget_script_dir()
est défini ici .subprocess.call(['python', 'test1.py'])
.Si vous voulez que test1.py reste exécutable avec les mêmes fonctionnalités que lorsqu'il est appelé dans service.py, faites quelque chose comme:
test1.py
service.py
la source
En utilisant os, vous pouvez appeler directement votre terminal. Si vous voulez être encore plus précis, vous pouvez concaténer votre chaîne d'entrée avec des variables locales, c'est-à-dire.
la source
os.system
doivent être évités, vous pouvez faire de même avec n'importe quelle classe dePopen, Call,
Vous ne devriez pas faire ça. Au lieu de cela, faites:
test1.py:
service.py
la source
Utilisation
import test1
pour la 1ère utilisation - il exécutera le script. Pour les appels ultérieurs, traitez le script comme un module importé et appelez lareload(test1)
méthode.Une simple vérification de
sys.modules
peut être utilisée pour appeler l'action appropriée. Pour continuer à faire référence au nom du script sous forme de chaîne ('test1'
), utilisez le module intégré ' import ()' .la source
reload
est parti en Python 3.if __name__ == "__main__":
guard. Il pourrait y avoir d'autres différences plus subtiles. Ne laissez pas de code arbitraire au niveau global. Mettez-le dans une fonction et appelez-le après l'importation comme suggéré dans la réponse acceptée à la placeJe préfère runpy :
la source
Pourquoi ne pas simplement importer test1? Chaque script python est un module. Une meilleure façon serait d'avoir une fonction par exemple main / run dans test1.py, import test1 et run test1.main (). Ou vous pouvez exécuter test1.py en tant que sous-processus.
la source
Comme cela a déjà été mentionné,
runpy
est un bon moyen d'exécuter d'autres scripts ou modules à partir du script actuel.Soit dit en passant, il est assez courant qu'un traceur ou un débogueur le fasse, et dans de telles circonstances, des méthodes telles que l'importation directe du fichier ou l'exécution du fichier dans un sous-processus ne fonctionnent généralement pas.
Il doit également être utilisé
exec
pour exécuter le code. Vous devez fournir correctementrun_globals
pour éviter une erreur d'importation ou d'autres problèmes. Reportez-vous àrunpy._run_code
pour plus de détails.la source
Ceci est un exemple avec la
subprocess
bibliothèque:la source
Popen
moins que les fonctions de niveau supérieur ne puissent vraiment pas faire ce que vous voulez. Dans ce cas,check_call
ourun
ferait tout ce dont vous avez besoin et plus, avec beaucoup moins de plomberie dans votre propre code.Ce processus est quelque peu anti-orthodoxe, mais fonctionnerait dans toutes les versions de python,
Supposons que vous vouliez exécuter un script nommé 'recommend.py' à l'intérieur d'une condition 'if', puis utilisez,
La technique est différente, mais fonctionne!
la source