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 : 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')
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
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?