web-dev-qa-db-fra.com

retourne la valeur d'un script python à un autre

J'ai deux fichiers: script1.py et script2.py. J'ai besoin d'invoquer script2.py à partir de script1.py et de renvoyer la valeur de script2.py à script1.py. Mais le problème est que script1.py exécute réellement script2.py via os.

script1.py:

import os
print(os.system("script2.py 34"))

script2.py

import sys
def main():
    x="Hello World"+str(sys.argv[1])
    return x

if __name__ == "__main__":
    x= main()

Comme vous pouvez le voir, je peux obtenir la valeur dans script2, mais pas dans script1. Comment puis je faire ça? REMARQUE: script2.py DOIT être appelé comme s'il s'agissait d'une exécution en ligne de commande. C'est pourquoi j'utilise os.

10
codingsplash

Ok, si je vous comprends bien, vous voulez:

  • passer un argument à un autre script
  • récupérer une sortie d'un autre script vers l'appelant d'origine

Je recommanderai d'utiliser le module de sous-processus. Le moyen le plus simple serait d'utiliser la fonction check_output () .

Exécutez la commande avec des arguments et retournez sa sortie sous forme de chaîne d'octets.

Exemple de solution:

script1.py

import sys
import subprocess
s2_out = subprocess.check_output([sys.executable, "script2.py", "34"])
print s2_out

script2.py:

import sys
def main(arg):
    print("Hello World"+arg)

if __name__ == "__main__":
    main(sys.argv[1])
16
Łukasz Rogalski

La méthode recommandée pour renvoyer une valeur d'un python "script" à un autre) consiste à importer le script en tant que module Python et à appeler les fonctions directement:

import another_module

value = another_module.get_value(34)

another_module.py est:

#!/usr/bin/env python
def get_value(*args):
    return "Hello World " + ":".join(map(str, args))

def main(argv):
    print(get_value(*argv[1:]))

if __name__ == "__main__":
    import sys
    main(sys.argv)

Vous pouvez à la fois importer another_module Et l'exécuter en tant que script à partir de la ligne de commande. Si vous n'avez pas besoin de l'exécuter en tant que script de ligne de commande, vous pouvez supprimer la fonction main() et le bloc if __name__ == "__main__".

Voir aussi Appeler python avec entrée avec dans un script python utilisant un sous-processus .

9
jfs