IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Lire la sortie d'une commande shell en temps réel [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut 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 : 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?

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir
    ben c'est tout bete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cmd = "python dummy.py 10"
    ShellRun (cmd)
    shellrun lancant cmd qui lance le pyton n'a pas de retour tant que l'operation dans pyton n'est pas fini
    et sous cette forme tu n'y peut rien

    maintenant si tu sais faire comuniquer pyton vers excel c'est dans pyton que tu dois avertir excel quand faire ceci ou cela
    je procede de la meme maniere avec des VBS dynamiques
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Salut,

    Je vois... Donc c'est une fausse bonne idée que j'avais là . Je sais effectivement demander à Python de modifier un workbook. Entre temps j'ai exploré du côté d'un module Python nommé xlwings que je trouve très prometteur et qui me permet, me semble-t-il, de faire à peu près ce que j'avais en tête: lancer un code Python, récupérer les sorties au fur et à mesure, et modifier des cellules sans jamais avoir à fermer le classeur ouvert ou lancer "à la main" l'interpréteur Python.

    Il existe des alternatives, mais je pense qu'actuellement c'est la meilleur.

    Merci pour ta réponse. Même si elle ne résoud pa vraiment le problème posé, je considère quand même que le sujet est résolu.

    Ciao

    J

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.5] Traitement de la sortie d'une commande linux en temps réél
    Par Psycha dans le forum Langage
    Réponses: 1
    Dernier message: 08/02/2016, 11h35
  2. récuperer la sortie d'une commande shell dans un programme C
    Par Biosox dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 21/08/2009, 11h55
  3. récupérer la sortie d'une commande shell
    Par Hypnocrate dans le forum Langage
    Réponses: 2
    Dernier message: 24/07/2009, 15h46
  4. [Système]Execution d'une commande shell
    Par n8ken dans le forum API standards et tierces
    Réponses: 24
    Dernier message: 29/03/2007, 04h36
  5. Récupération du résultat d'une commande shell
    Par klu dans le forum Langage
    Réponses: 8
    Dernier message: 16/02/2006, 23h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo