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

Python Discussion :

run avec bdb [Python 3.X]


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 105
    Par défaut run avec bdb
    Bonjour, mon code bloque si code demande une saisie et marche sans problème dans les autres cas.
    Par exemple un code qui marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    code="a=2\nprint(a)"
    stdin=""
    Par exemple un code qui bloque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    code="a=input()\nprint(a)"
    stdin="2"
    La classe est assez complexe, la trace bloque ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class maclass(Bdb):
    ...
     
    stdin="2" #au lieu de '' 
    mglobals = {
               '__name__': '__main__', '__builtins__': __builtins__,
     
                '__stdin__': StringIO(stdin), '__stdout__': StringIO(),
     
                '__stderr__': StringIO(),
            }
            try:
                self.run(code, mglobals , mglobals ) #blocage ici
    Merci d'avance pour vos idées.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Salut,

    input attend une fin de ligne pour terminer (mais peut être que fin de fichier marche aussi).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 105
    Par défaut
    En fait si je tape une valeur l’exécution se fait, donc il ne prend pas dans la valeur passée en argument.
    Mettre -W où ?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Salut,

    Reformulez le problème autrement: "comment rediriger le stdin sur lequel va lire input?"
    Et, pourquoi utiliser input lorsque le stdin n'est pas standard?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 105
    Par défaut
    Imaginons que j'ai la chaine : Est-il possible d'appeler le fichier test.py dans une fonction de sorte que les valeurs 1 et 2 arrivent dans l'entrée standard de l’environnement test.py ?

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Salut,

    Pour rediriger le stdin, ceci fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import sys
    from io import StringIO
     
    count = 3
    f = StringIO('\n'.join(str(n) for n in range(count)))
     
    saved = sys.stdin
    sys.stdin = f
    for _ in range(count):
        print(input())
     
    sys.stdin = saved
    donc on peut le faire.

    Après je ne comprends pas trop ce que vous cherchez à faire...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 105
    Par défaut
    Je n'arrive pas à tester (c'est peut être un début solution):
    fichier test.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import subprocess,os
     
    path=os.path.dirname(__file__)
    print(path)
     
    proc = subprocess.Popen(path+'\sanstitre1.py',stdin=subprocess.PIPE,stdout=subprocess.PIPE)
    proc.stdin.write("1")
    proc.stdin.write("2")
     
    retour= proc.communicate()[0]
    print(retour)
    sanstitre1.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    a=input()
    b=input()
    print(a+b)
    J 'ai l'erreur : Le fichier spécifié est introuvable
    Alors qu'il est présent et bien enregistrer.

  8. #8
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 105
    Par défaut
    Bon j'essaye d'exécuter une script via subprocess

    fichier debut.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    import subprocess 
     
    p1=subprocess.Popen(['bash', '-c', 'test.py;entree()'])
    attente = p1.wait()
    out, err = p1.communicate()
    print(out)
    fichier test.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def entree():
        return "ok entree"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bash: -c: ligne1: Erreur de syntaxe : fin de fichier prématurée
    App 3687131 output: [ pid=3687131, time=2021-04-24 12:20:45,021 ]: WSGI application raised an exception!

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Salut,

    Citation Envoyé par radjiv97441 Voir le message
    Je n'arrive pas à tester (c'est peut être un début solution)
    Certes mais vous passez d'un sujet (la redirection de de stdin) à la création de processus où on précise les stdin, stdout, stderr...

    Et à un autre problème: "Le fichier spécifié est introuvable" sans trop de rapport avec la question initiale ou des essais qui montrent que vous n'avez pas trop cherché à comprendre les outils que vous essayez d'utiliser.
    Est ce que la commande "bash -c test.py;entree()" lancée depuis un shell bash fait ce que vous attendez? Et si çà ne le fait pas est ce que subprocess va s'en sortir mieux?

    Il y a des trous dans votre formation à la programmation. Trous qui font qu'il n'est pas sûr que ce que vous voulez faire marcher soit une solution au problème que vous cherchez à résoudre (il faudrait commencer par l'exposer plutôt que vous acharner à faire tomber en marche à coup de marteau).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 105
    Par défaut
    Oui je l'avoue que la solution que je cherche dépasse mes connaissances, je cherche néanmoins cette solution qui me semble le plus adéquate à mon problème de base : étant donnée un fichier de code avec des inputs, ce dernier pioche successivement les valeurs sur l'entrée standard.
    par exemple a=input() ... b=input() seront alimentés automatiquement. Est-ce que vous voyez ce que je veux ?

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Citation Envoyé par radjiv97441 Voir le message
    je cherche néanmoins cette solution qui me semble le plus adéquate à mon problème de base : étant donnée un fichier de code avec des inputs, ce dernier pioche successivement les valeurs sur l'entrée standard.
    Attendez çà c'est votre façon de poser le problème. Ca ne dit rien sur pourquoi vous en êtes rendu là, ni sur le pourquoi du pourquoi où des "5 pourquoi" qu'on devrait appliquer à la résolution d'un problème.

    Citation Envoyé par radjiv97441 Voir le message
    par exemple a=input() ... b=input() seront alimentés automatiquement. Est-ce que vous voyez ce que je veux ?
    Je vous ai montré qu'on sait rediriger stdin avec un exemple fonctionnel. Vous partez à utiliser subprocess sans trop avoir pris le temps d'apprendre à comment çà marche.

    Quelque part vous avez déjà un soucis de conception...
    Après si vous vous lancez dans des projets trop compliqués par rapport à votre niveau de connaissances actuels, c'est un problème dans votre plan de formation (qui n'a rien à voir avec Python).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 105
    Par défaut
    Merci, on y arrive au bout : était mon bug
    Voilà le problème résolu avec ton idée de stdin=f :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import sys,os
    from subprocess import Popen, PIPE, STDOUT
     
    from tempfile import SpooledTemporaryFile as tempfile
    f = tempfile()
    f.write('1\n'.encode('utf-8'))
    f.write('2\n'.encode('utf-8'))
    f.seek(0)
    cmd = [sys.executable,os.path.join(os.path.dirname(__file__),"test.py")]
    retour=Popen(cmd,stdout=PIPE,stdin=f).stdout.read()
    print(retour.decode('utf-8'))
    f.close()
    test.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    a=input()
    b=input()
    print(a,b)

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Salut,

    Personnellement, j'écrirais:
    test.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def f(a, b):
         print(a, b)
    puis depuis le module appelant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import test
    a = 1
    b = 2
    test.f(a, b)
    Si le code de test.py est "dynamique", on pourrait s'aventurer à l'exécuter via "exec".

    De toutes façons, si l'appelant "sait" quels paramètres passer à "test.f" et les récupérer, l'interface fonction sera plus simple à mettre en œuvre qu'une mécanique de sérialisation (passer par des chaines de caractères).

    Et si test.py doit pouvoir être utilisé comme programme, l'interface standard sera de récupérer les paramètres d'appels, i.e. l'appelant peut l'appeler avec test.py a=1 b=2. Charge à test.py de différencier le cas module/programme pour récupérer les paramètres à passer à f en les récupérant depuis la lignes de commande ou en les demandant à l'utilisateur (via input).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 105
    Par défaut
    De base je ne connais pas le contenu de test.py (je sais qu'il a du code python prés à être exécuté)
    Puis une variable fournira toutes les valeurs necessaire au bon déroulement de test.py.

  15. #15
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    et maintenant vous passez par os.system comme quoi pas la peine de se fatiguer à essayer de faire marcher quoi que ce soit...

    Citation Envoyé par radjiv97441 Voir le message
    De base je ne connais pas le contenu de test.py (je sais qu'il a du code python prés à être exécuté)
    Puis une variable fournira toutes les valeurs necessaire au bon déroulement de test.py.
    Vous êtes obligé a un minimum de mode d'emploi.

    Techniquement, on appelle çà une "interface".

    Et quelque part, vous devriez avoir d'autres raisons de ne pas utiliser les interfaces existantes que l'ignorance de leur existence/fonctionnement.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  16. #16
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 105
    Par défaut
    Mon projet est fini, mais il n'est pas super j'ai dû tout mettre dans un même fichier (120k)
    J'ai réessayé votre méthode, mais il ne marche pas : il est toujours bloquant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import sys
    from io import StringIO
     
    count = 3
    f = StringIO('\n'.join(str(n) for n in range(count)))
     
    saved = sys.stdin
    sys.stdin = f
    for _ in range(count):
        print(input())
     
    sys.stdin = saved

  17. #17
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2017
    Messages : 105
    Par défaut
    Ah, voilà enfin, retour des autres sur le même projet : Spider bug sur sys.stdin

    Ce programme marche en ligne mais pas sur Spider (avec entree.txt 2 valeurs)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import sys
     
    fd = open('entree.txt')
    sys.stdin = fd
     
    a= int(input()) 
    b= int(input()) 
    print(a,b)
    sys.stdin = sys.__stdin__

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 18/11/2013, 10h50
  2. Réponses: 3
    Dernier message: 27/05/2010, 09h18
  3. Application.run avec le nom de la macro complémentaire en paramètre
    Par ckrikri dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/02/2009, 10h57
  4. [VBA-E]Application.run avec paramètres
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/03/2007, 16h48
  5. run avec argument
    Par noussa_nouha dans le forum NetBeans
    Réponses: 12
    Dernier message: 14/08/2006, 22h43

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