1
votes

Appel d'un script python avec des arguments d'un autre script python

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 ,


0 commentaires

3 Réponses :


1
votes

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


0 commentaires

0
votes

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

scriptA.py: importation de config_handler depuis scriptB

other_process(name="config_process_name", target=config_handler, args=("myconfig.yml",))

2.) Ensuite, appelez simplement le processus et envoyez vos arguments à it:

scriptA.py: appel de la fonction scriptB.py, config_handler

import multiprocessing
from scriptB import config_handler

def other_process(*args):
    p = multiprocessing.Process(*args)
    p.start()

Opinion:

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.


0 commentaires

0
votes

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


0 commentaires