[Résolu]-[Python] Plantage extraction photo via fchslc

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Avatar de l’utilisateur
Ernest
Membre hOOnoraire
Membre hOOnoraire
Messages : 143
Inscription : 26 févr. 2019 14:56

[Résolu]-[Python] Plantage extraction photo via fchslc

Message par Ernest »

Bonsoir,

Je rencontre un gros problème dans le développement d' une macro Python. En effet, alors que depuis une console Linux, la macro fonctionne bien, elle plante systématiquement lorsque je la lance depuis un formulaire LO base.
Lorsque je lance la macro depuis une console, fchslc contient le chemin d' une photo.
La sélection d' une photo depuis le formulaire LO Base fonctionne aussi puisque, je peux extraire le chemin de la photo, son nom ainsi que l' extension du fichier depuis la variable fchslc.
Par contre dès que je tente d' extraire les données exif, c' est le blocage.
Voici le code de la macro:

Code : Tout sélectionner

#!/usr/bin/env python3

from uno import * 
from exiftool import *
from datetime import datetime
from fractions import *
from sys import *
from os import chdir

# Sélectionner une photographie	
fchslc = ' '
def fntslc(event=None):	
    ctx = XSCRIPTCONTEXT.getComponentContext()
    create = ctx.ServiceManager.createInstance
    filepicker = create("com.sun.star.ui.dialogs.FilePicker")
    filepicker.execute()  
    global fchslc
    fchslc = filepicker.Files[0]

dmspht = ' '; dtpht = ' ';hrpht = ' '; exp = ' '; vrtbjc = ' ';flash = ' '
def dnxf():
    # Dimension de la photo
    global dmpht
    dmspht = lrg, ' x ',htr 
    # Extraction de la date et de l' heure de prise de vue
    dt = datetime.strptime(dtcrt,"%Y:%m:%d %H:%M:%S")
    global dtpht; global hrpht
    dtpht = dt.strftime('%d-%m-%Y')
    hrpht = dt.strftime('%H:%M:%S')
    # Temps d' exposition
    global exp
    #x = int(1 / tmpxps)
    #exp = Fraction(1,x)
    # Ouverture
    global vrtbjc
    y = vrt
    vrtbjc = format(y, '0.1f')
    # Flash actif
    global flash
    if flash == 16:
        flash = 'Inactif'
    else:
        flash = 'Actif'
 
fntslc()			#Ouverture de la fenêtre de sélection d' un fichier

# Recherche des balises du chemin du fichier
bls = '/'
pstbls = fchslc.rfind(bls,0,10)
xbls = fchslc.count(bls)
i = 0
while i <= xbls:
    pstbls1 = fchslc.rfind(bls)
    i = i + 1
bls2 = '.'
pstbls2 = fchslc.rfind(bls2)

# Chemin du fichier
chmfch = fchslc[pstbls:pstbls1 + 1]

# Nom de la photo
nmpht = fchslc[pstbls1 + 1:pstbls2]

# Type d' extention du fichier
xtn = fchslc[pstbls2 + 1:]

#Extraction du fabricant de l' appareil
with ExifTool() as e:
    marque = e.get_tag('Make', fchslc)
# Sélection de la procédure en fonction du fabricant de l' appareil
if marque == None:
    print ("Il n' y a pas de données exif pour cette photographie !")
    marque = 'Inconnue'; mdl = 'Inconnue'; dtpht = 'Inconnue'; hrpht = 'Inconnue'
    dmspht = 'Inconnue'; tmpxps = 'Inconnue'; fcl = 'Inconnue'; lngfcl = 'Inconnue'
    iso = 'Inconnue'; vrtbjc = 'Inconnue'; lmn = 'Inconnue'; flash = 'Inconnue'
    bjc = 'Inconnue'
elif marque == 'Canon':
    with ExifTool() as e:
        mdl = e.get_tag('Model', fchslc)		# Modèle appareil
        dtcrt = e.get_tag('DateTimeOriginal', fchslc)	# Date et heure prise de vue
        lrg = e.get_tag('ImageWidth', fchslc)		# Largeur photo
        htr = e.get_tag('ImageHeight', fchslc)		# Hauteur photo
        tmpxps = e.get_tag('ExposureTime', fchslc)	# Temps d' exposition
        fcl = e.get_tag('FNumber', fchslc)		# Focale
        lngfcl = e.get_tag('FocalLength', fchslc)	# Longueur de focale
        iso = e.get_tag('Iso', fchslc)			# Sensibilité
        vrt = e.get_tag('ApertureValue', fchslc)	# Ouverture objectif
        lmn = e.get_tag('LightValue', fchslc) 		# Luminosité
        flash = e.get_tag('Flash', fchslc)		# Position flash
        bjc = e.get_tag('lenstype', fchslc)		# Objectif utilisé
        dnxf()
elif marque == 'FUJIFILM':
    with ExifTool() as e:
        mdl = e.get_tag('Model', fchslc)		# Modèle appareil
        dtcrt = e.get_tag('DateTimeOriginal', fchslc)	# Date et heure prise de vue
        lrg = e.get_tag('ImageWidth', fchslc)		# Largeur photo
        htr = e.get_tag('ImageHeight', fchslc)		# Hauteur photo
        tmpxps = e.get_tag('ExposureTime', fchslc)	# Temps d' exposition
        fcl = e.get_tag('FNumber', fchslc)		# Focale
        lngfcl = e.get_tag('FocalLength', fchslc)	# Longueur de focale
        iso = e.get_tag('Iso', fchslc)			# Sensibilité
        vrt = e.get_tag('ApertureValue', fchslc)	# Ouverture objectif
        lmn = e.get_tag('LightValue', fchslc) 		# Luminosité
        flash = e.get_tag('Flash', fchslc)		# Position flash
        bjc = e.get_tag('lenstype', fchslc)		# Objectif utilisé
        dnxf()
else:
    with ExifTool() as e:
        mdl = e.get_tag('Model', fchslc)		# Modèle appareil
        dtcrt = e.get_tag('DateTimeOriginal', fchslc)	# Date et heure prise de vue
        lrg = e.get_tag('ImageWidth', fchslc)		# Largeur photo
        htr = e.get_tag('ImageHeight', fchslc)		# Hauteur photo
        tmpxps = e.get_tag('ExposureTime', fchslc)	# Temps d' exposition
        fcl = e.get_tag('FNumber', fchslc)		# Focale
        lngfcl = e.get_tag('FocalLength', fchslc)	# Longueur de focale
        iso = e.get_tag('Iso', fchslc)			# Sensibilité
        vrt = e.get_tag('ApertureValue', fchslc)	# Ouverture objectif
        lmn = e.get_tag('LightValue', fchslc) 		# Luminosité
        flash = e.get_tag('Flash', fchslc)		# Position flash
        bjc = e.get_tag('lenstype', fchslc)		# Objectif utilisé
        dnxf()

# Creation du fichier de sauvegarde
chdir('/home/elfouste/Documents/Python/MacroPython/Tst_Fch')
fch = 'FchDn.txt'
with open('FchDn.txt', 'w') as fch:
    fch.write(chmfch)
    fch.write(nmpht)
    fch.write(xtn)
    fch.write(dtpht)
    fch.write(hrpht)
    fch.write(marque)
    fch.write(mdl)
    fch.write(str(dmspht))
    fch.write(str(tmpxps))
    fch.write(str(fcl))
    fch.write(str(lngfcl))
    fch.write(str(iso))
    fch.write(str(bjc))
    fch.write(str(vrtbjc))
    fch.write(str(lmn))
    fch.write(str(flash))

#sys.exit()
Pour info je joins le texte de l' erreur;
h**ps://www.noelshack.com/2019-24-1-1560183742-erreur.png
Je ne comprends pas cette erreur. En effet, elle fait référence au module json alors que je ne l' utilise pas.
Auriez-vous une idée?
Cordialement
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Ernest le 14 juin 2019 18:36, modifié 1 fois.
Xubuntu 20.04 en dual boot avec Win10
Libre Office 7.06
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12221
Inscription : 08 nov. 2005 16:23
Localisation : Caen, France

Re: [Python]-Erreur macro

Message par Bidouille »

Pour la bonne tenue de ce forum, veillez à :
  1. Ne pas héberger d'image en dehors du forum.
  2. Mettre un titre explicite reflétant le problème exposé en évitant les termes implicites.
Fait à votre place pour cette fois.
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Python] Plantage extraction photo via fchslc

Message par Hubert Lambert »

Bonjour,
Ernest a écrit :Lorsque je lance la macro depuis une console, fchslc contient le chemin d' une photo.
As-tu essayé de voir ce que cette variable contient, dans LibreOffice, au moment de la passer à exiftools ?
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Ernest
Membre hOOnoraire
Membre hOOnoraire
Messages : 143
Inscription : 26 févr. 2019 14:56

Re: [Python] Plantage extraction photo via fchslc

Message par Ernest »

Bonsoir,
Effectivement, j' ai contrôlé le contenu de la variable. Après lancement depuis LO Base, elle contient bien le chemin du fichier avec le nom du fichier ainsi que son extension. J' arrive sans soucis à isoler depuis cette variable les informations suivantes par exemple:
Chemin : /home/elfouste/Images
Nom : IMG_001
Extension : jpg
Par contre, dès que je cherche les données exif, c' est là que j' obtiens ce message d' erreur notant le soucis avec le module json.
Par acquis de conscience, j' ai tenté d' utiliser ce module. Le résultat a été identique. Temps que je n' ai pas cherché à récupérer les données exifs, la macro a fonctionné. Par contre, dés que j' ai voulu récupérer le nom du fabricant , j' ai eu droit au même message d' erreur!!!
Le problème pourrait-il venir d' une incompatibilité de LO Base et de Python. Je précise que je suis sous Firebird et non en HSQLBD.
Cordialement
Xubuntu 20.04 en dual boot avec Win10
Libre Office 7.06
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Python] Plantage extraction photo via fchslc

Message par Hubert Lambert »

Pourras-tu donner le contenu exact de la variable ?
Parce que pour ce que je comprends, tu récupères une url interne à LibO, commençant par "file:///", incompréhensible pour python.
Essaie aussi de faire une recherche avec le mot clé fileUrlToSystemPath.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Ernest
Membre hOOnoraire
Membre hOOnoraire
Messages : 143
Inscription : 26 févr. 2019 14:56

Re: [Python] Plantage extraction photo via fchslc

Message par Ernest »

Bonsoir,

Vous avez raison, la variable fchslc contient les données suivantes:file:///home/elfouste/Images/001.JPG. J' ai donc créer une nouvelle variable qui reçoit /home/elfouste/Images/001.JPG. En utilisant cette nouvelle variable pour extraire les données exifs, je récupère bien les données recherchées.
Le problème est donc réglé.
Merci Hubert Lambert car sans vous j' étais bloqué. Je vais pouvoir me pencher maintenant sur le traitement des données car certains résultats sont trop mathématiques et peu "photographiques" :D

Cordialement
Xubuntu 20.04 en dual boot avec Win10
Libre Office 7.06