#1 Le 29/06/2020, à 08: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, à 17:26)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#2 Le 29/06/2020, à 08: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, à 16: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, à 16:23)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#4 Le 29/06/2020, à 17: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, à 04: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, à 04:32)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#6 Le 30/06/2020, à 10: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, à 17: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 !!!
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne