Erreur macro python

Erreur macro python - Python - Programmation

Marsh Posté le 10-06-2019 à 18:39:29    

Bonjour,
Pour classer mes photos, je travaille à la mise au point d' une application sous LibreOffice Base. Débutant en Python, j' ai démarré une macro qui me permet de récupérer les données exifs.
Voici le programme en cours de développement:

Code :
  1. #!/usr/bin/env python3
  2. from uno import *
  3. from exiftool import *
  4. from datetime import datetime
  5. from fractions import *
  6. from sys import *
  7. from os import chdir
  8. # Sélectionner une photographie
  9. fchslc = ' '
  10. def fntslc(event=None):
  11.     ctx = XSCRIPTCONTEXT.getComponentContext()
  12.     create = ctx.ServiceManager.createInstance
  13.     filepicker = create("com.sun.star.ui.dialogs.FilePicker" )
  14.     filepicker.execute() 
  15.     global fchslc
  16.     fchslc = filepicker.Files[0]
  17. dmspht = ' '; dtpht = ' ';hrpht = ' '; exp = ' '; vrtbjc = ' ';flash = ' '
  18. def dnxf():
  19.     # Dimension de la photo
  20.     global dmpht
  21.     dmspht = lrg, ' x ',htr
  22.     # Extraction de la date et de l' heure de prise de vue
  23.     dt = datetime.strptime(dtcrt,"%Y:%m:%d %H:%M:%S" )
  24.     global dtpht; global hrpht
  25.     dtpht = dt.strftime('%d-%m-%Y')
  26.     hrpht = dt.strftime('%H:%M:%S')
  27.     # Temps d' exposition
  28.     global exp
  29.     #x = int(1 / tmpxps)
  30.     #exp = Fraction(1,x)
  31.     # Ouverture
  32.     global vrtbjc
  33.     y = vrt
  34.     vrtbjc = format(y, '0.1f')
  35.     # Flash actif
  36.     global flash
  37.     if flash == 16:
  38.         flash = 'Inactif'
  39.     else:
  40.         flash = 'Actif'
  41. fntslc()   #Ouverture de la fenêtre de sélection d' un fichier
  42. # Recherche des balises du chemin du fichier
  43. bls = '/'   #Extraction de la position du caractère h
  44. pstbls = fchslc.rfind(bls,0,4)
  45. bls1 = '/'
  46. xbls1 = fchslc.count(bls1) #Extraction de la position du caractère s
  47. i = 0
  48. while i <= xbls1:
  49.     pstbls1 = fchslc.rfind(bls1)
  50.     i = i + 1
  51. bls2 = '.'
  52. pstbls2 = fchslc.rfind(bls2)
  53. # Chemin du fichier
  54. chmfch = fchslc[pstbls:pstbls1 + 1]
  55. # Nom de la photo
  56. nmpht = fchslc[pstbls1 + 1:pstbls2]
  57. # Type d' extention du fichier
  58. xtn = fchslc[pstbls2 + 1:]
  59. # Fichier actuel
  60. fchact = fchslc
  61. #Extraction du fabricant de l' appareil
  62. with ExifTool() as e:
  63.     marque = e.get_tag('Make', fchact)
  64. # Sélection de la procédure en fonction du fabricant de l' appareil
  65. if marque == None:
  66.     print ("Il n' y a pas de données exif pour cette photographie !" )
  67.     marque = 'Inconnue'; mdl = 'Inconnue'; dtpht = 'Inconnue'; hrpht = 'Inconnue'
  68.     dmspht = 'Inconnue'; tmpxps = 'Inconnue'; fcl = 'Inconnue'; lngfcl = 'Inconnue'
  69.     iso = 'Inconnue'; vrtbjc = 'Inconnue'; lmn = 'Inconnue'; flash = 'Inconnue'
  70.     bjc = 'Inconnue'
  71. elif marque == 'Canon':
  72.     with ExifTool() as e:
  73.         mdl = e.get_tag('Model', fchact)  # Modèle appareil
  74.         dtcrt = e.get_tag('DateTimeOriginal', fchact) # Date et heure prise de vue
  75.         lrg = e.get_tag('ImageWidth', fchact)  # Largeur photo
  76.         htr = e.get_tag('ImageHeight', fchact)  # Hauteur photo
  77.         tmpxps = e.get_tag('ExposureTime', fchact) # Temps d' exposition
  78.         fcl = e.get_tag('FNumber', fchact)  # Focale
  79.         lngfcl = e.get_tag('FocalLength', fchact) # Longueur de focale
  80.         iso = e.get_tag('Iso', fchact)   # Sensibilité
  81.         vrt = e.get_tag('ApertureValue', fchact) # Ouverture objectif
  82.         lmn = e.get_tag('LightValue', fchact)   # Luminosité
  83.         flash = e.get_tag('Flash', fchact)  # Position flash
  84.         bjc = e.get_tag('lenstype', fchact)  # Objectif utilisé
  85.         dnxf()
  86. elif marque == 'FUJIFILM':
  87.     with ExifTool() as e:
  88.         mdl = e.get_tag('Model', fchact)  # Modèle appareil
  89.         dtcrt = e.get_tag('DateTimeOriginal', fchact) # Date et heure prise de vue
  90.         lrg = e.get_tag('ImageWidth', fchact)  # Largeur photo
  91.         htr = e.get_tag('ImageHeight', fchact)  # Hauteur photo
  92.         tmpxps = e.get_tag('ExposureTime', fchact) # Temps d' exposition
  93.         fcl = e.get_tag('FNumber', fchact)  # Focale
  94.         lngfcl = e.get_tag('FocalLength', fchact) # Longueur de focale
  95.         iso = e.get_tag('Iso', fchact)   # Sensibilité
  96.         vrt = e.get_tag('ApertureValue', fchact) # Ouverture objectif
  97.         lmn = e.get_tag('LightValue', fchact)   # Luminosité
  98.         flash = e.get_tag('Flash', fchact)  # Position flash
  99.         bjc = e.get_tag('lenstype', fchact)  # Objectif utilisé
  100.         dnxf()
  101. else:
  102.     with ExifTool() as e:
  103.         mdl = e.get_tag('Model', fchact)  # Modèle appareil
  104.         dtcrt = e.get_tag('DateTimeOriginal', fchact) # Date et heure prise de vue
  105.         lrg = e.get_tag('ImageWidth', fchact)  # Largeur photo
  106.         htr = e.get_tag('ImageHeight', fchact)  # Hauteur photo
  107.         tmpxps = e.get_tag('ExposureTime', fchact) # Temps d' exposition
  108.         fcl = e.get_tag('FNumber', fchact)  # Focale
  109.         lngfcl = e.get_tag('FocalLength', fchact) # Longueur de focale
  110.         iso = e.get_tag('Iso', fchact)   # Sensibilité
  111.         vrt = e.get_tag('ApertureValue', fchact) # Ouverture objectif
  112.         lmn = e.get_tag('LightValue', fchact)   # Luminosité
  113.         flash = e.get_tag('Flash', fchact)  # Position flash
  114.         bjc = e.get_tag('lenstype', fchact)  # Objectif utilisé
  115.         dnxf()
  116. # Creation du fichier de sauvegarde
  117. chdir('/home/elfouste/Documents/Python/MacroPython/Tst_Fch')
  118. fch = 'FchDn.txt'
  119. with open('FchDn.txt', 'w') as fch:
  120.     fch.write(chmfch)
  121. #    fch.write(nmpht)
  122. #    fch.write(xtn)
  123. #    fch.write(dtpht)
  124. #    fch.write(hrpht)
  125. #    fch.write(marque)
  126. #    fch.write(mdl)
  127. #    fch.write(str(dmspht))
  128. #    fch.write(str(tmpxps))
  129. #    fch.write(str(fcl))
  130. #    fch.write(str(lngfcl))
  131. #    fch.write(str(iso))
  132. #    fch.write(str(bjc))
  133. #    fch.write(str(vrtbjc))
  134. #    fch.write(str(lmn))
  135. #    fch.write(str(flash))
  136. #sys.exit()


Son exécution est déclenché par pression sur un bouton du formulaire de LO. Je peux sélectionner une photo mais par la suite, j' ai le message d' erreur contenu dans le lien ci-dessous:
[img]https://image.noelshack.com/minis/2019/24/1/1560183742-erreur.png[/img]
Je ne comprends pas pourquoi l' erreur mentionne "JSON" alors que je ne fait pas appel à ce type de langage.
Pourriez-vous m' en dire plus.
Cordialement
PS Je suis sous Xubuntu 18.04, Libre Office 6.02 et python 3.6

Reply

Marsh Posté le 10-06-2019 à 18:39:29   

Reply

Marsh Posté le 10-06-2019 à 19:01:58    

On dirait que le bazar utilise du JSON en interne. Tu es sûr que fchact contient un nom de fichier valide lors de l'appel de get_tag()?

Reply

Marsh Posté le 10-06-2019 à 20:26:30    

Bonsoir,
 
La chose dont je suis sur c' est que fchslc contient bien le chemin de la photo sélectionnée. Pour ce qui est de fchact de la ligne 69, je me suis rendu compte que cette variable ne servait à rien. Aussi, va t' elle disparaître dans la prochaine version. Ce que je ne comprend vraiment pas c' est pourquoi, la macro utilise du JSON!!!
 
Cordialement

Reply

Marsh Posté le 10-06-2019 à 21:37:29    

Bonsoir,
 
Petit complément d' information, c' est la ligne 69 qui est à l' origine de l' erreur. J' en suis arrivé à cette conclusion en reconstruisant ligne à ligne la macro.  
Par contre, je suis bien incapable de dire pourquoi.
 
Cordialement

Reply

Marsh Posté le 15-06-2019 à 20:59:50    

Bonsoir,
 
En fait le problème vient de la variable fchslc. Cette dernière lors de la sélection du fichier prend une valeur par exemple de:
file:///home/elfouste etc....
Cette formulation, python ne sait pas l' utiliser. Il faut donc supprimer du chemin du fichier la partie file://.
Depuis cette modification, la macro fonctionne.
 
Cordialement

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed