Contenu | Rechercher | Menus

Annonce

Ubuntu-fr vend de superbes t-shirts et de belles clés USB 32Go
Rendez-vous sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/06/2020, à 09:22

ar barzh paour

[Résolu] erreur script python

(voir #7 pour résolution par ajout de tempo)
bonjour à tous
j'utilise depuis plusieurs années un shell bash qui fait appel à un script python
qui jusque là fonctionnait bien (dernière utilisation en 18.04 en janvier 2020)


hier je le lance et j'obtiens une erreur
après plusieurs tentatives , chaque fois référence à "trace"  (mais pas au même endroit)

un exemple d'erreur

Traceback (most recent call last):
  File "./via.py", line 60, in <module>
    trace(suite,'suite avant')
  File "./via.py", line 38, in trace
    print()
BlockingIOError: [Errno 11] write could not complete without blocking

la fonction "trace" n'est qu'une trace à l'écran pour avoir un suivi visuel

def trace(s,tit=''):
 print("%-5s= "%tit,end='')
 for k in s: print("%02x"%(k),end='')
 print()

ne trouvant pas d'erreur dans le script , 
je finis par dièser tous les appels à cette fonction .. miracle je n'ai plus d'erreur ...

le script via.py est celui-ci

with open(fic_i,'rb') as f, open(fic_o,'wb') as g :
 while True:
     lire les infos du fichier d'entrée
     traiter les infos dont appel trace(......)
     écrire le résultat dans le fichier de sortie

     


une autre astuce qui m'a fait fonctionner mon script : ajout d'une tempo (qui évidemment me ralentit le traitement )

 while True:
   time.sleep(0.01)
   reste du script (y compris trace(.....)

à quoi cela peut-il être du ? (c'est la même machine )
une autre façon plus élégante de faire tourner ce script ?

Dernière modification par ar barzh paour (Le 30/06/2020, à 18:26)


Ubuntu 20.04 UEFI ( avril 2020)
diverses versions 18.04 (uefi et non uefi) ,  16.04 , 14.04 (inutilisée sauf un logiciel)
PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 20.04

Hors ligne

#2 Le 29/06/2020, à 09:41

pingouinux

Re : [Résolu] erreur script python

Bonjour,
Il faudrait que tu montres le script complet (du moins suffisamment complet pour reproduire l'erreur), et la façon dont tu l'appelles.

Hors ligne

#3 Le 29/06/2020, à 17:14

ar barzh paour

Re : [Résolu] erreur script python

est-ce suffisanrt ?
l'appel du script python
./via.py  source cible "chaine"
(en fait c'est une boucle sur une dizaine de fichiers source ,de fichiers cible et de chaîne)

pour que le script fonctionne , le fichier source doit être formaté correctement

exemple de fichier source (suite d'octets)
le premier enregistrement :

02 40 00 00 00 20 BC 07 00 F6 F3 45 00 22 41 34
32 20 42 6F 75 72 67 20 65 6E 20 42 72 65 73 73 
65 20 3D 3E 20 4C 79 6F 6E 20 20 28 30 31 29 20

41 69 72 65 20 43 43 49 20 32 39 39 34 34 22 00
et ça recommence , la description est dans le script
dans l'exemple ci-dessus
02                type
40 00 00 00       longueur de l'enregistrement
20 BC 07 00       longitude
F6 F3 45 00       latitude
22 41 ..... 22 00 une chaine de texte terminée par 00
ici la longueur de l'enregistrement fait 40 00 00 00 octets (c'est à dire 64 octets)

[EDIT]
pour avoir un exemple réel de fichier
http://www.campingcar-infos.com/Francais/recherche.php
télécharger en choisissant "TomTom"
choisir dans l'archive l'un des fichiers .ov2 , le plus gros étant celui qui s'appelle ATOTALES.ov2
[/EDIT]


le script via.py

#!/usr/bin/env python3
import sys, re , time

fic_i=sys.argv[1] # argument 1 : fichier à traiter (ASN_CCI.ov2 par exemple)
fic_o=sys.argv[2] # argument 2 : fichier créer     (ASN.dat     par exemple) 
aire=sys.argv[3]  # argument 3 : (SN par exemple)   (A C CF CS PCC PJ PN S SN TOTALES
                  #              sera mis en tête de la nouvelle "chaîne"
# ==================================================
# le fichier ov2 est en format 
#   <type>     <longueur>   <longitude>   <latitude>   <description>
#   1 octet    4 octets     4 octets      4 octets     n octets
#   1   +      4    +       4     +       4     +      n          = longueur
#       remarque on considère que la description comprend le 00 de fin

# =======================================================================
def lire(f) :
  typ=f.read(1)
  if not typ: exit()
  # lire 4 octets,convertir en entier ,ordre suivant le type du système
  lon=int.from_bytes(f.read(4),sys.byteorder) 
  bl1=f.read(4)
  bl2=f.read(4)
  suite=f.read(lon-1-4-4-4)
  return typ, lon, bl1, bl2, suite
  
#==================================================
def ecrire(f) :
  f.write(typ)
  # écrire 4 octets ordre suivant le type du système
  f.write(lon.to_bytes(4,sys.byteorder))
  f.write(bl1)
  f.write(bl2)
  f.write(suite)
  
#==================================================
def trace(s,tit=''):
 print("%-5s= "%tit,end='')
 for k in s: print("%02x"%(k),end='')
 print()
 
#==================================================
with open(fic_i,'rb') as f, open(fic_o,'wb') as g :
 while True:
   time.sleep(0.01) # sinon j'obtiens des ereurs de trace
                    # BlockingIOError: [Errno 11] write could not complete without blocking
   print()
   typ, lon, bl1, bl2, suite = lire(f)
   print(fic_i)                         # fichier en cours de triatement.
   print(suite)                         # b'"LE BOURGET .... "\x00'
   print(type(suite))                   # <class 'bytes'>

   print("le type")
   trace(typ,'typ')

   print("la longueur avant") 
   print("lon avant = %d"%lon)
   
   print("la latitute et la longitude") 
   trace(bl1,'bl1')
   trace(bl2,'bl2')

   print("la suite de ces infos") 
   trace(suite,'suite avant')

   print("les modifications")
                                           # aire est le 3ème argument du script
   ajout=bytes(aire+" ",'latin1')          # type de codage obligatoire 'utf8,'latin1'..
   suite=re.sub(b'^"',b'"'+ajout,suite)    # remplace le 1er guillemet par guillemet + ajout 
   suite=re.sub(b'Aire CCI',b'#',suite)    # remplace Aire CCI par #   s'il y a
   suite=re.sub(b'=>',b'=#',suite)         # remplace =>       par =#  s'il y a
   suite=re.sub(b'<=',b'#=',suite)         # remplace <=       par #=  s'il y a

   lon=1+4+4+4+len(suite)
   print("lon après = %d"%lon)
   trace(suite,'suite après')

   ecrire(g)

Dernière modification par ar barzh paour (Le 29/06/2020, à 17:23)


Ubuntu 20.04 UEFI ( avril 2020)
diverses versions 18.04 (uefi et non uefi) ,  16.04 , 14.04 (inutilisée sauf un logiciel)
PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 20.04

Hors ligne

#4 Le 29/06/2020, à 18:17

pingouinux

Re : [Résolu] erreur script python

J'ai testé ton script avec le fichier ATOTALES_CCI.ov2, et ne reproduis pas l'erreur.

Hors ligne

#5 Le 30/06/2020, à 05:29

ar barzh paour

Re : [Résolu] erreur script python

@pingouinux :
merci pour l'essai
si tu n'as pas supprimé la ligne qui évite l'erreur c'est normal

time.sleep(0.01) # sinon j'obtiens des erreurs de trace

il faut diéser la ligne

# time.sleep(0.01) # sinon j'obtiens des erreurs de trace

Dernière modification par ar barzh paour (Le 30/06/2020, à 05:32)


Ubuntu 20.04 UEFI ( avril 2020)
diverses versions 18.04 (uefi et non uefi) ,  16.04 , 14.04 (inutilisée sauf un logiciel)
PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 20.04

Hors ligne

#6 Le 30/06/2020, à 11:16

pingouinux

Re : [Résolu] erreur script python

il faut diéser la ligne

C'est bien ce que j'ai fait.

Hors ligne

#7 Le 30/06/2020, à 18:25

ar barzh paour

Re : [Résolu] erreur script python

bon alors c'est dans le bash d'appel du script via.py qu'il y a quelquechose
tant pis je n'arrive pas à voir ce que c'est et ça me semble compliquer d'expliquer ce qui se passe

en passant la tempo à 0.001 et je n'ai pas d'erreur

time.sleep(0.01)

je marque résolu puisque j'ai trouvé un palliatif !!!


Ubuntu 20.04 UEFI ( avril 2020)
diverses versions 18.04 (uefi et non uefi) ,  16.04 , 14.04 (inutilisée sauf un logiciel)
PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 20.04

Hors ligne