Lire la sortie d'une commande shell en temps réel
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):
Code:
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') |
Maitenant le code VBA (pompé):
Code:
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 |
Je lance cette fonction comme ceci:
Code:
1 2
| cmd = "python dummy.py 10"
ShellRun (cmd) |
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..
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:
Code:
1 2 3 4 5
| sLine = ""
While Not sLine = "END"
sLine = oOutput.ReadLine
MsgBox sLine
Wend |
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?