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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    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

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    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 confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    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 très actif
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    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

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    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
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    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

  7. #7
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    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

  8. #8
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    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

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    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

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