Salut,
Je cherche à récupérer en temps réel la sortie d'une commande shell. Actuellement je suis capable de récupérer une sortie, mais pas au fur et à mesure, seulement à la toute fin du processus.
J'ai un programme sous Python que je souhaite appeler depuis VBA. Ce code mouline et sort un résultat de temps en temps. Ici, je veux dire qu'un résultat s'affiche dans la console. Je souhaiterais être en mesure de récupérer ces résultats au fur et à mesure qu'ils sont générés.
Voici un prototype. Même les néopythes Python ne devraient pas avoir de problème à comprendre (toutes les 2s un entier s'affiche de 0 à n):
Maitenant le code VBA (pompé):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 def loop(n): import time for i in range(int(n)): time.sleep(2) print(i) if __name__ == '__main__': try: loop(sys.argv[1]) except Exception as e: print(e) os.system('pause')
Je lance cette fonction comme ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Public Function ShellRun(sCmd As String) As String 'Run a shell command, returning the output as a string Dim oShell, oExec, oOutput As Object Dim s As String, sLine As String Set oShell = CreateObject("WScript.Shell") Set oExec = oShell.Exec(sCmd) Set oOutput = oExec.StdOut ' Le problème est lié a cet attribut "AtEndOfStream" je pense While Not oOutput.AtEndOfStream sLine = oOutput.ReadLine MsgBox sLine If sLine <> "" Then s = s & sLine & vbNewLine Wend Set oOutput = Nothing: Set oExec = Nothing Set oShell = Nothing End Function
Le problème c'est que les résultats ne s'affichent qu'à la fin du programme Python. Je pense que c'est le oOutput.AtEndOfStream qui est en cause, mais je ne trouve rien d'autre sur le net. Pas même d'autres methodes dispos..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 cmd = "python dummy.py 10" ShellRun (cmd)
J
[EDIT]
Je pige pas grand chose en VB... Ma dernière tentative consiste à ajouter la fin de mon programme Python un retour dans stdout spécial marquant la fin, en l'occurrence "END". Je me dis que je pourrais boucler indéfiniment tant que "END" n'apparait pas et afficher la sortie:
Mais ça ne change rien, le code freeze le temps que le programme python se termine, puis les msgbox s'affichent à la suite... Mais pourquoi? Sont-ils mis en attente quelque part le temps que l'exécutation de la commande soit terminée?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 sLine = "" While Not sLine = "END" sLine = oOutput.ReadLine MsgBox sLine Wend
Partager