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 :

intéraction entre plusieurs langages et les commandes unix


Sujet :

Python

  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut intéraction entre plusieurs langages et les commandes unix
    Bonjour,

    Selon un message de cette discussion (https://www.developpez.net/forums/ne...eply&p=8968469), les commande système sortirait des chaîne de caractères selon l'encodage ascii alors que python3 tout comme java gérerait les caractère en unicode, dès lors comment faire communiquer des programme, par exemple un programme python3 qui prenne en argument qui pour traiter la chaine de caractère appel une commande systèmes comme cat et grep qui en sortie génère du texte ascii et non unicode

    Est-ce qu'on est confronté à la même question quand on soiaite faire communiquer un programme écrit en python avec un autre écrit en php en utilisant aussi des commande unix ?


    Note à l'intention du modérateur : je ne suis pas sûr d'avoir mis ce sujet au bon endroit, merci de le ranger.

    Merci pour vos renseignements

    Salutations
    Battant

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par Battant Voir le message
    python3 tout comme java gérerait les caractère en unicode, dès lors comment faire communiquer des programme, par exemple un programme python3 qui prenne en argument qui pour traiter la chaine de caractère appel une commande système s comme cat et grep qui en sortie génère du texte ascii et non unicode
    Vous avez un tuto. fournit par la communauté Python qui explique tout çà. Il faut le lire, et si vous ne comprenez pas un point précis l'illustrer par un exemple qu'on puisse reproduire quelque chose et savoir de quoi on parle.

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

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Citation Envoyé par Battant Voir le message
    ...par exemple un programme python3 qui prenne en argument qui pour traiter la chaine de caractère appel une commande systèmes comme cat et grep qui en sortie génère du texte ascii et non unicode
    Tu as un exemple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vincent@djoliba:~/Bureau$ cat test
    déjàvu
    Si cat est utilisé avec subprocess ça ne devrait rien changer.
    C'est vrai que certains programmes peuvent nécessiter de forcer l'usage de l'unicode mais ça se fait directement dans la commande passée à subprocess.

  4. #4
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut
    Bonjour,

    Oui j'ai un exemple regarder c'est Messages extrait de cette discussion

    https://www.developpez.net/forums/d1...n/#post8966043


    Citation Envoyé par Battant Voir le message
    Bonjour,

    Le script que je tente de développé à pour rôle de d'examiner la chaine de caractère qu'on lui passe en paramètre. s'il trouve des caractère spéciaux, il doit les remplacer par leur nom en se basant sur un fichier csv Le but est d'envoyer le tout à un moteur de synthèse vocale pour qu'il puisse lire du code source

    Voici le code :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    #! /usr/bin/python3.5
    # -*-coding:UTF-8 -*
     
     # ce code contient des parties excraite de la page
     
    # ce script python sera appelé par le script en ligne de
    # commande lire_texte_sécectionné, il prend en paramètre de ligne de commande une chaine de caractère
    # la parcour et recherche dans la table de caractère spéciaux si il existe une correspondance
    # si c'est le cas on remplace le caractère par son nom dans
    # la chaine de sortie
     
    # ce script prend en paramère une chaine de caractère et remplace les caractère spéciaux par leur nom
    # obligation vous ai faite de citer les auteurs
    # pour chaque caractère que contient la variable j
    		# rechercher si ce dernier est dans le fichier tab_caractère.csv
    		# si le caractère est trouvé, alors le remplacer par son nom indiqué dans le ficher et l'envoyer à la systès vocal
    # auteur Battant
    # licence gpl v3 : ce script est sous licence gpl v3 chaque personne qui travaillle sur ce script aura le droit de ce faire payer ou non pour sa partie
    # ce script contient du code extrait de la page : http://stackoverflow.com/questions/8984287/execute-php-code-in-python
    import sys, traceback  # ligne issus de : https://docs.python.org/3.5/library/traceback.html
    import subprocess
    import os
     
    def runcommand (command) :
    	"""
            
            code extrait de :
            
            https://docs.python.org/3.5/library/subprocess.html
    http://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line  """
    	output = ""
    	try :
    		proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
    		outputbyte = proc.stdout.read()
    		output =  outputbyte.decode()
    	except UnicodeEncodeError :	
    		print ("Une erreur et survenue lors de la conversion de byte à string",sys.stderr())
    		traceback.print_exc(file=sys.stderr) # ligne issus de : https://docs.python.org/3.5/library/traceback.html
    	finally :
    		return output
    output1 = ""
    output2 = ""
    if __name__ == "__main__" :
    	if len(sys.argv) < 2:
    		print ("veillez fournir en argument le code source que vous souhauter traiter en le plaçant entre guillement pour qu'il soit compréhensible par un moteur de synthèse vocale")
    	else :
    		i = 1
    		# parcourir la chaine de caractère
    		while i < len(sys.argv) :
    			# parcourir une chaine après l'autre et examiner chaque caractère
    			word = sys.argv[i]
    			outputWord = ""
    			print ("word=",word)
    			for j in word :
    				print ("j = ",j )
    				if (j == '.') :
    					print ("cat point")
    					output1 = runcommand("cat tab_carractère_spéciaux.csv | cut -f1 | grep \"\.\"")
    				else :
    					print ("cat normal")
    					output1 = runcommand ("cat tab_carractère_spéciaux.csv | cut -f1 | grep \"{0}\"").format(j)
    				if output1 != "" :
    					if output1 == (".") :
    						print ("grep point : ".output1)
    						output2 = runcommand("grep \"{0}\" tab_carractère_spéciaux.csv| cut -f2".format("\."))
    					elif output1 != "" :
    						print ("grep normal : ",output1)
    						output2 = runcommand("grep \"{0}\" tab_carractère_spéciaux.csv| cut -f2".format(output1))
    						print ("output 2 : ",output2 )
    					outputWord += output2
    				else :
    					print ("lettre normal : ",output1)
    					outputWord += word[i]
    			print ("outputWord=",outputWord)
    			i += 1
    voici le contenu du fichier csv

    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
    23
    24
    25
    26
     
    cat tab_carractère_spéciaux.csv 
    {	accolade ouverte
    ]	accolade fermée
    (	paranthèse ouverte
    )	parenthèse fermée
    [	crochet ouvert
    ]	crochet fermé
    ,	virgule
    .	point
    :	deux point
    ;	point virgule
    &	and
    @	at
    +	plus
    ½	pourcent
    /	slash
    ?	point d'intérogation
    '	apostrophe
    "	guillement
    $	dollar
    |	pipe
    =	égale
    *	asterisque
    -	tiret	
    _	underscore
    Pour ceux qui travaille sur windows, il faut installer les commande unix


    Je laisse une copie du fichier csv ci-joint

    Bon test

    Salutations
    En l'occurrence d'après la réponse Line de commande système renvoie le résultat en format ASCIu et non Unicode

    Donc dans le langage que je connais il y a Java qui utilise d Unicode python qui utilise du unicode et les lignes de commande qui utilisent du ASCII je ne sais pas pour PHP ni pour c ou c++

    Donc comment peut-on faire communiquer tous ces langages et programmes et récuper les résultats dans un encodage correct

    Faut-il faire des conversions bon codage et si oui est-ce que la documentation que vous m'avez envoyé me l'explique ?

    Salutations
    Battant

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par Battant Voir le message
    En l'occurrence d'après la réponse Line de commande système renvoie le résultat en format ASCII et non Unicode
    Relisez la suggestion de VinsS.
    Vous créez un fichier "test.dat" contenant des caractères non-ASCII sur Linux.
    Vous récupérez la sortie de "cat test.dat" lancé par subprocess.
    Et vous comparez le résultat entre sortie.decode() et sortie.decode("utf-8").
    Normalement, çà devrait être "pareil" (Linux travaille en utf-8)

    Donc si votre programme ne fonctionne pas, il est peut probable que ce soit à cause de çà... Sauf à isoler le problème et le reproduire plus simplement pour qu'on puisse savoir de quoi on parle (mais çà pas grand monde le fera à votre place, car avec Python on ne va pas écrire çà comme çà).

    Citation Envoyé par Battant Voir le message
    Faut-il faire des conversions bon codage et si oui est-ce que la documentation que vous m'avez envoyé me l'explique ?
    Ah ben, pas sûr que vous compreniez tout du premier coup mais si vous ne faites pas l'effort de la lire, vous ne le saurez pas.

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

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Je ne suis pas sur de comprendre le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    def runcommand():
        cmd = ["cat", "char.txt"]
        proc = subprocess.Popen(cmd, universal_newlines=True, stdout=subprocess.PIPE)
        print(proc.stdout.read())
     
    runcommand()
    qui donne:
    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
    23
    24
    25
     
    {	accolade ouverte
    ]	accolade fermée
    (	paranthèse ouverte
    )	parenthèse fermée
    [	crochet ouvert
    ]	crochet fermé
    ,	virgule
    .	point
    :	deux point
    ;	point virgule
    &	and
    @	at
    +	plus
    ½	pourcent
    /	slash
    ?	point d'intérogation
    '	apostrophe
    "	guillement
    $	dollar
    |	pipe
    =	égale
    *	asterisque
    -	tiret	
    _	underscore

  7. #7
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut
    Bonjour,

    Normalement le script n'est cencé retourné qu'une seul possibilité. Il devrait :

    1. Examiner la chaine passée en argument caractère après caractère
    2. Pour chaque caractère, rechercher dans le fichier csv s'il le trouve
    3. Si tel est le cas, mettre sont nom dans la chaine de sortie du programme



    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
     
    Code de Battamt
     
    #Ce code est sous gpl v3 chaque personne qui travaille dessus à le droit de se faire payer ou non
    #Obligation de citer le nom des auteurs respectif.
    # chaque personne garde les droits sur sa partie de code reppectif tout en permettant aux autre de la modifier. et de la redistribuer selon les terme de la gpl v3
     
    if (j == '.') :
    					print ("cat point")
    					output1 = runcommand("cat tab_carractère_spéciaux.csv | cut -f1 | grep \"\.\"")
    				else :
    					print ("cat normal")
    					output1 = runcommand ("cat tab_carractère_spéciaux.csv | cut -f2 | grep \"{0}\"").format(j)
    				if output1 != "" :
    					if output1 == (".") :
    						print ("grep point : ".output1)
    						output2 = runcommand("grep \"{0}\" tab_carractère_spéciaux.csv| cut -f2".format("\."))
    					elif output1 != "" :
    						print ("grep normal : ",output1)
    						output2 = runcommand("grep \"{0}\" tab_carractère_spéciaux.csv| cut -f2".format(output1))
    						print ("output 2 : ",output2 )
    Il faut la ligne de codeif (j == '.') : car le point est un cas particulier en ligne de commande.

    j'obtient actuellemnt un résultat simiaire au suivant

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    python3 remplacer_caractères_par_nom.py "self.nom = nom"
    word= self.nom = nom
    j =  s
    cat normal
    lettre normal :  
    j =  e
    cat normal
    lettre normal :  
    j =  l
    cat normal
    lettre normal :  
    j =  f
    cat normal
    lettre normal :  
    j =  .
    cat point
    grep normal :  .
     
    output 2 :  nomCaractère
    accolade ouverte
    accolade fermée
    paranthèse ouverte
    parenthèse fermée
    crochet ouvert
    crochet fermé
    virgule
    point
    deux point
    point virgule
    and
    at
    plus
    pourcent
    slash
    point d'intérogation
    apostrophe
    guillement
    dollar
    pipe
    égale
    asterisque
    tiret
    underscore
     
     
    j =  n
    cat normal
    lettre normal :  
    j =  o
    cat normal
    lettre normal :  
    j =  m
    cat normal
    lettre normal :  
    j =   
    cat normal
    lettre normal :  
    j =  =
    cat normal
    lettre normal :  
    j =   
    cat normal
    lettre normal :  
    j =  n
    cat normal
    lettre normal :  
    j =  o
    cat normal
    lettre normal :  
    j =  m
    cat normal
    lettre normal :  
    outputWord= eeeenomCaractère
    accolade ouverte
    accolade fermée
    paranthèse ouverte
    parenthèse fermée
    crochet ouvert
    crochet fermé
    virgule
    point
    deux point
    point virgule
    and
    at
    plus
    pourcent
    slash
    point d'intérogation
    apostrophe
    guillement
    dollar
    pipe
    égale
    asterisque
    tiret
    underscore
     
    eeeeeeeee
    Autant dire que le script ne recnnait pas les caractère. d'après mes test arriverait cependant à dire si le résultat du premier cat est vide ou nom mais il ne reconnait pas par exemple quand il s'agit d'un point ou nom

    Pourriez-vous m'aider

    Merci d'avance

    Salutations
    Battant

  8. #8
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Relisez la suggestion de VinsS.
    Vous créez un fichier "test.dat" contenant des caractères non-ASCII sur Linux.
    Vous récupérez la sortie de "cat test.dat" lancé par subprocess.
    Et vous comparez le résultat entre sortie.decode() et sortie.decode("utf-8").
    Normalement, çà devrait être "pareil" (Linux travaille en utf-8)

    Donc si votre programme ne fonctionne pas, il est peut probable que ce soit à cause de çà... Sauf à isoler le problème et le reproduire plus simplement pour qu'on puisse savoir de quoi on parle (mais çà pas grand monde le fera à votre place, car avec Python on ne va pas écrire çà comme çà).



    Ah ben, pas sûr que vous compreniez tout du premier coup mais si vous ne faites pas l'effort de la lire, vous ne le saurez pas.

    - W
    Bonjour,

    J'ai faits le test et apparament il ne semenble y avoir aucune différence entre décode et decode("utf-8") cela semble s'expliquer par le fait que d'après la documentatation utf-8 semble être utilisé par défaut

    info sur

    https://docs.python.org/3/library/st...e#bytes.decode

    Mais alors n'y a-il vraiment aucune différence quelque soit le ssytème utiliser. sous windows, on peut toujours installer les commande unix

    Merci pour vos renseignement

    Salutations
    Battant

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par Battant Voir le message
    Pourriez-vous m'aider
    C'est quoi la question? Comment échapper "\" pour qu'il passe dans la chaîne de caractères passée à Popen?
    Quel est le rapport avec la question initiale?

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

  10. #10
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut Reconnaissance de caractère dans un résultat retourné par une commande
    Citation Envoyé par wiztricks Voir le message
    C'est quoi la question? Comment échapper "\" pour qu'il passe dans la chaîne de caractères passée à Popen?
    Quel est le rapport avec la question initiale?

    - W
    Bonjour,

    Le problème c'est que le programme arrive a reconaitre que la promièpre commande retourne bien quelque chose mais il n'arrive pas à reconnaitre quand le premier résultat est un".", dans ce cas justement, la syntaxe de la deuxième commande est " grep \." mais pas grep "." sinon grep ne reconnais pas qu'il s'agit d'un point.

    De plus le résultat de la chaine final resemble à

    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
    23
    24
    25
    26
    27
    28
    29
     
     
    eeeenomCaractère
    accolade ouverte
    accolade fermée
    paranthèse ouverte
    parenthèse fermée
    crochet ouvert
    crochet fermé
    virgule
    point
    deux point
    point virgule
    and
    at
    plus
    pourcent
    slash
    point d'intérogation
    apostrophe
    guillement
    dollar
    pipe
    égale
    asterisque
    tiret
    underscore
     
    eeeeeeeee

    pourriez-vous me dire pourqoi le programme me retourne toute la deduxième colone du csv (cut -f2 foncieonne bien) mais ra recherce du caractère trouvé éventuellement par le premier cat semmble ne pas fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    grep \"{0}\" tab_carractère_spéciaux.csv| cut -f2".format(output1))

    Merci pour votre aide

    Salutations

    Battant
    Battant

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par Battant Voir le message
    pourriez-vous me dire pourqoi le programme me retourne toute la deduxième colone du csv (cut -f2 foncieonne bien) mais ra recherce du caractère trouvé éventuellement par le premier cat semmble ne pas fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    grep \"{0}\" tab_carractère_spéciaux.csv| cut -f2".format(output1))
    Parce vous passez à grep "." (au lieu de "\."... ou plutôt de \\.) i.e. une expression régulière qui demande à grep de matcher les chaînes de 1 caractère.
    Ce que vous pouvez vérifier avec la commande magique "print" pour vérifier si la chaîne de caractères que vous avez construite ressemble bien à ce qu'il faut... (ce qui est la moindre des choses à faire avant de poster non?).

    Et poser une question en rapport avec le problème à résoudre plutôt que de partir dans tous les sens.

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

  12. #12
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Parce vous passez à grep "." (au lieu de "\."... ou plutôt de \\.) i.e. une expression régulière qui demande à grep de matcher les chaînes de 1 caractère.
    Ce que vous pouvez vérifier avec la commande magique "print" pour vérifier si la chaîne de caractères que vous avez construite ressemble bien à ce qu'il faut... (ce qui est la moindre des choses à faire avant de poster non?).

    Et poser une question en rapport avec le problème à résoudre plutôt que de partir dans tous les sens.

    - W
    Bonjour,

    Non, je me suis trompé de ligne

    Voici le code correcte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if output1 == (".") :
    						print ("grep point : ".output1)
    						output2 = runcommand("grep \"{0}\" tab_carractère_spéciaux.csv| cut -f2".format("\."))
    					elif output1 != "" :
    						print ("grep normal : ",output1)
    						output2 = runcommand("grep \"{0}\" tab_carractère_spéciaux.csv| cut -f2".format(output1))
    						print ("output 2 : ",output2 )
    La ligne censé s'exécuter est donc dans le cas d'un point

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    						output2 = runcommand("grep \"{0}\" tab_carractère_spéciaux.csv| cut -f2".format("\."))
    sauf que le point ne semble pas être reconnu quand il est transmis par le premier cat et donc le programme passe au mauvais endroit

    Pourquoi ?

    Merci pour le renseignement
    Battant

  13. #13
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut
    Bonjour

    petit complément d'infos, extrait de cette discussion

    https://www.developpez.net/forums/d1...n/#post8969184

    Citation Envoyé par wiztricks Voir le message
    Salut,

    Votre code remplace des caractères spéciaux ASCII par des chaînes de caractères non ASCII.
    Avec Python, vous pourriez mettre ces correspondances dans un dictionnaire et effectuer ce remplacement dans une simple boucle.
    Ce qui éviterait d'avoir à appeler subprocess pour lui faire exécuter des commandes Linux qui auront le mauvais goût de coder leur sortie en fonction de la locale ou de l'environnement système.

    - W
    D'après cettte personne, les commande code leur sortie en fonction du système d'exploitation.

    Comment donc traiter ces sortie avec python et autre langage ?

    Merci pour les renseignement

    Salutations
    Battant

  14. #14
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    J'aimerai poser une question.

    Pourquoi utilises-tu des commandes Unix avec Python pour faire un travail que Python peut faire lui-même.

    Lire un fichier et en analyser le texte est tellement trivial avec Python que tu aurais déjà terminé ton script à l'heure qu'il est. Et sans te prendre la tête.

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par Battant Voir le message
    Pourquoi ?
    Parce qu'output1 ne contient pas (que) "."
    Prenez la peine de regarder ce qu'il contient...

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

  16. #16
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut Visualiser le contenu d'une chaine de caractère y compris les caractères spéciaux invisibles.
    Citation Envoyé par wiztricks Voir le message
    Parce qu'output1 ne contient pas (que) "."
    Prenez la peine de regarder ce qu'il contient...

    - W
    Bonjour,

    Justement comment puis-je visualiser le contenu d'une chaîne caractère y compris les caractères spéciaux généralement invisible ?

    Merci pour le renseignement

    Salutations
    Battant

  17. #17
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par Battant Voir le message
    Justement comment puis-je visualiser le contenu d'une chaîne caractère y compris les caractères spéciaux généralement invisible ?
    En utilisant astucieusement print avec un format du genre '/%s/' qui va baliser le début et la fin, afficher la longueur de la chaîne, la convertir en hexa,... à vous d'imaginer la bonne technique en fonction de ce que vous voulez visualiser.
    note: Comme Popen retourne des "bytes", le print de ces bytes (avant le .decode()) pourrait vous montrer tout çà.

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

  18. #18
    Membre averti
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Points : 366
    Points
    366
    Par défaut
    Bonjour,

    J'ai modifié quelque peu la méthoe runcommand

    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
     
    def runcommand (command) :
    	"""
            
            code extrait de :
            
            https://docs.python.org/3.5/library/subprocess.html
    http://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line  """
    	output = ""
    	try :
    		proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
    		outputbyte = proc.stdout.read()
    		print ("outputbyte %s : ",outputbyte)
    		output =  outputbyte.decode()
    		print ("output : ",output)
    	except UnicodeEncodeError :	
    		print ("Une erreur et survenue lors de la conversion de byte à string",sys.stderr())
    		traceback.print_exc(file=sys.stderr) # ligne issus de : https://docs.python.org/3.5/library/traceback.html
    	finally :
    		return output
    sortie extrait du terminal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    outputbyte %s :  b''
    output :
    Question : pourquoi bien outputbyte contient des byte une fois décodé en chaine de caractère, cette dernière semble ne rien contenir ?

    Merci pour votre aide

    Salutations
    Battant

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par Battant Voir le message
    Question : pourquoi bien outputbyte contient des byte une fois décodé en chaine de caractère, cette dernière semble ne rien contenir ?
    Lancez la console Python et essayez avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> s = b'    '   # des bytes correspondants à l'espace.
    >>> print(s)
    b'    '
    >>> print(s.decode())  
     
    >>>
    Tous les caractères ne sont pas visibles mais on peut les compter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> len(s)
    4
    >>> len(s.decode())
    4
    >>>
    et dans ce cas, il y en a autant.

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

  20. #20
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Citation Envoyé par Battant Voir le message
    Bonjour,

    J'ai modifié quelque peu la méthoe runcommand
    Ça ne répond pas à ma question, ça.

Discussions similaires

  1. Commande UNIX sur les filesystem
    Par alexd dans le forum Unix
    Réponses: 5
    Dernier message: 05/09/2008, 10h40
  2. Visualiser les liens entre plusieurs tables .dbf
    Par emmy99 dans le forum Autres SGBD
    Réponses: 6
    Dernier message: 21/02/2008, 19h47
  3. Réponses: 1
    Dernier message: 24/05/2006, 12h10
  4. Réponses: 2
    Dernier message: 13/03/2006, 17h25
  5. [langage] Commande Unix en Perl
    Par totox17 dans le forum Langage
    Réponses: 3
    Dernier message: 20/11/2002, 10h59

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