Je suis encore un novice en python, donc excuses à l'avance. J'ai des sujets connexes à ce sujet mais je n'ai pas trouvé la meilleure solution. ( Exécutez un script python à partir d'un autre script python, en passant des arguments ) Fondamentalement, j'ai un script python (scriptB.py) qui prend un fichier de configuration comme argument et fait des choses. J'ai besoin d'appeler ce script à partir d'un autre script python (scriptA.py).
Si je n'avais pas d'arguments à passer, j'aurais pu le faire
import subprocess subprocess.Popen("scriptB.py myconfig.yaml", shell=True)
Cependant, les choses est devenu un peu compliqué car nous devons passer le fichier de configuration (mycnofig.yml) comme argument.
L'une des suggestions était d'utiliser;
os.system(python scriptB.py myconfig.yml)
Mais , elle est souvent signalée comme une approche non recommandée et qu'elle ne fonctionne souvent pas.
Une autre suggestion était d'utiliser:
import scriptB.py
Je ne suis pas très bien sûr si c'est une pratique courante.
Je veux juste souligner que les deux scripts n'ont pas de main à l'intérieur du script.
Veuillez nous conseiller sur la meilleure façon de gérer cela.
Merci ,
3 Réponses :
cela devrait très bien fonctionner
subprocess.Popen (['python', '/full_path/scriptB.py', 'myconfig.yaml'], stdout = PIPE, stderr = PIPE)
Voir https: //docs.python.org/3/library/subprocess.html#replacing-os-popen-os-popen2-os-popen3
Si vous avez vraiment besoin d'exécuter un processus séparé, il est probablement préférable d'utiliser la bibliothèque multitraitement. Je créerais une fonction réelle dans scriptB.py qui ferait le travail. Dans l'exemple ci-dessous, je considère config_handler comme une fonction à l'intérieur de scriptB.py qui prend en fait l'argument du chemin du fichier de configuration.
1.) créez une fonction qui gérera l'appel de votre script python externe, importez également votre script et la méthode à l'intérieur qui prend des arguments
other_process(name="config_process_name", target=config_handler, args=("myconfig.yml",))
2.) Ensuite, appelez simplement le processus et envoyez vos arguments à it:
import multiprocessing from scriptB import config_handler def other_process(*args): p = multiprocessing.Process(*args) p.start()
D'après les informations que vous avez fournies , j'imagine que vous pourriez réussir à faire cela sans processus séparés. Faites simplement les choses dans l'ordre et faites de scriptB.py une bibliothèque avec une fonction que vous utilisez dans scriptA.py.
Il semble que vous ayez toutes vos réponses dans l'ancien fil, mais si vous voulez vraiment l'exécuter via os, pas via python, voici ce que je fais:
output = run(your_command.split(), stdout=PIPE, stderr=DEVNULL).stdout.decode('utf-8')
Au cas où vous besoin de la sortie:
from subprocess import run, PIPE, DEVNULL your_command = './scriptB.py myconfig.yaml' run(your_command.split(), stdout=PIPE, stderr=DEVNULL)
Si le scriptB a l'en-tête shebang indiquant au bash que c'est un script python, il doit l'exécuter correctement.
Le chemin peut être à la fois relatif et absolu.
C'est pour Python 3.x