Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur d' execution Basic

Module non appelable

Sujet résolu
    18 novembre 2019 à 14:05:52

    Bonjour,

    J' ai développé avec bien du mal un programme python qui me permet d ' extraire les données exif d' une photo. Ce programme correspondait bien à mes attentes jusqu' à ce que je sois obligé de réinstaller Xubuntu sur mon portable. depuis, j'  ai un message d' erreur.

    Pour compléter l' information, ce script est lancé depuis un formulaire libre office base par l 'intermédiaire d' un bouton. C' est une macro Basic qui lance le programme.

    Texte de la macro Basic:

    Sub ImpPht()
    
    	Dim masterSPF as Object, scriptP as object, Mnscript as object
    	Dim NmScript as string, Langage as string, Pst as string
    
    '	NmScript = "slcfch.py$slcfch"
    	NmScript = "appelmodule.py$slcpht"
    	Langage = "Python"
    	Pst = "user"
    	masterSPF = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")
    	scriptP = masterSPF.createScriptProvider("")
    	MnScript = scriptP.getScript("vnd.sun.star.script:" & NmScript & "?language=" & Langage & "&location=" & Pst)
    	MnScript.invoke(Array(), Array(), Array())
    	
    End Sub

    Ce programme lance le programme Python suivant:

    #!/usr/bin/env python3
    
    from uno import *
    from sys import *
    from os import chdir
    import csv
    import slcpht
    
    fchslc = ' '
    
    def slcfch(event):
        ctx = XSCRIPTCONTEXT.getComponentContext()
        fchslc = slcfch.fntslc(ctx)

    Enfin, le module d' extraction des données Exif:

    #!/usr/bin/env python3
    
    from exiftool import *
    from os import chdir
    from datetime import datetime
    from fractions import Fraction
    
    chmcmppht = ' '; marque = ' '
    
    def fntslc(ctx):
        create = ctx.ServiceManager.createInstance
        dsr = create("com.sun.star.ui.dialogs.OfficeFilePicker")
        dsr.setDisplayDirectory("file:///media/elfouste/El_Casot/Yvon/Phototeque1/A_Trier/")
        dsr.execute()
        #global fchslc
        fchslc = dsr.Files[0]
    
        # Chemin complet du fichier
        #global chmcmppht
        bls = '/'
        pstbls = fchslc.rfind(bls,0,10)
        chmcmppht = fchslc[pstbls:]
    
        # Chemin du fichier
        xbls = chmcmppht.count(bls)
        i = 0
        while i <= xbls:
            pstbls1 = chmcmppht.rfind(bls)
            i = i + 1
        chmpht = chmcmppht[:pstbls1]
    
        # Nom de la photo
        bls2 = '.'
        pstbls2 = chmcmppht.rfind(bls2)
        nmpht = chmcmppht[pstbls1 + 1:pstbls2]
    
        # Récupération des données exif
        with ExifTool() as e:
            marque = e.get_tag('Make', chmcmppht)
        if marque == None:
            print ("Il n' y a pas de données exif pour cette photographie !")
            marque = 'Inconnue'; xtnpht = '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:
                xtnpht = e.get_tag('FileTypeExtension', chmcmppht)
                vlrmdl = e.get_tag('Model', chmcmppht)
                bjc = e.get_tag('LensType', chmcmppht)
                dtcrt = e.get_tag('DateTimeOriginal', chmcmppht)
                lrg = e.get_tag('ImageWidth', chmcmppht)
                htr = e.get_tag('ImageHeight', chmcmppht)
                xps = e.get_tag('ExposureTime', chmcmppht)
                vlrfcl = e.get_tag('FNumber', chmcmppht)
                vlrlngfcl = e.get_tag('FocalLength', chmcmppht)
                iso = e.get_tag('Iso', chmcmppht)
                vlrlmn = e.get_tag('LightValue', chmcmppht)
                pstflash = e.get_tag('Flash', chmcmppht)
        elif marque == 'FUJIFILM':
            with ExifTool() as e:
                xtnpht = e.get_tag('FileTypeExtension', chmcmppht)
                vlrmdl = e.get_tag('Model', chmcmppht)
                bjc = e.get_tag('LensType', chmcmppht)
                dtcrt = e.get_tag('DateTimeOriginal', chmcmppht)
                lrg = e.get_tag('ImageWidth', chmcmppht)
                htr = e.get_tag('ImageHeight', chmcmppht)
                xps = e.get_tag('ExposureTime', chmcmppht)
                vlrfcl = e.get_tag('FNumber', chmcmppht)
                vlrlngfcl = e.get_tag('FocalLength', chmcmppht)
                iso = e.get_tag('Iso', chmcmppht)
                vlrlmn = e.get_tag('LightValue', chmcmppht)
                pstflash = e.get_tag('Flash', chmcmppht)
        else:
            with ExifTool() as e:
                xtnpht = e.get_tag('FileTypeExtension', chmcmppht)
                vlrmdl = e.get_tag('Model', chmcmppht)
                bjc = e.get_tag('LensType', chmcmppht)
                dtcrt = e.get_tag('DateTimeOriginal', chmcmppht)
                lrg = e.get_tag('ImageWidth', chmcmppht)
                htr = e.get_tag('ImageHeight', chmcmppht)
                xps = e.get_tag('ExposureTime', chmcmppht)
                vlrfcl = e.get_tag('FNumber', chmcmppht)
                vlrlngfcl = e.get_tag('FocalLength', chmcmppht)
                iso = e.get_tag('Iso', chmcmppht)
                vlrlmn = e.get_tag('LightValue', chmcmppht)
                pstflash = e.get_tag('Flash', chmcmppht)
    
        # Clé du fichier
        cfpht = 1
    
        # Nom de l' appareil photo
        bls3 = ' E '
        if marque == 'Canon':
            pstbls3 = fchslc.rfind(bls3)
            mdl = vlrmdl[6:len(vlrmdl)]
        elif marque == 'FUJIFILM':
            mdl = vlrmdl
        else:
            mdl = 'Inconnu'
    
        # Type d' objectif utilisé
        if bjc == 53:
            tpbjc = 'Canon EF-S 18-55mm f/3.5-5.6 III'
        elif bjc == 45:
            tpbjc = 'Canon EF-S 18-55mm f/3.5-5.6 [II]'
        elif bjc == 39:
            tpbjc = 'Canon EF 75-300mm f/4-5.6'
        else:
            tpbjc = 'Inconnu'
    
        # Extraction de la date et de l' heure de prise de vue
        dt = datetime.strptime(dtcrt,"%Y:%m:%d %H:%M:%S")
        dtpht = dt.strftime('%d-%m-%Y')
        hrpht = dt.strftime('%H:%M:%S')
    
        # Dimension de la photo
        dmspht = '%s*%s' % (lrg, htr)
    
        # Temps d' exposition
        x = Fraction(xps).limit_denominator(1000)
        nmr = x.numerator
        dnm = x.denominator
        tmpxps = '%s/%s' % (nmr, dnm)
    
        # Valeur de focale
        fcl = 'f '+ str(round(vlrfcl, 1))
        
        # Longueur de focale
        lngfcl = str(vlrlngfcl)+ ' mm'
    
        # Valeur de luminosité
        lmn = round(vlrlmn,1)
    
        # Valeur de flash
        if pstflash == 16:
            pstfls = 'Inactif'
        else:
            pstfls = 'Actif'
    
        #Sauvegarde des données exif
        chdir('/home/elfouste/Documents/Python/Svg_Csv')
        with open('DnExif.csv', 'w') as f:
            f.write('Cf_Pht'); f.write(','); f.write('ChmPht'); f.write(','); f.write('NmPht')
            f.write(','); f.write('XtnPht'); f.write(','); f.write('Fbc'); f.write(',')
            f.write('MdlApp'); f.write(','); f.write('Bjc'); f.write(','); f.write('DtPht')
            f.write(','); f.write('HrPht'); f.write(','); f.write('DmsPht')
            f.write(','); f.write('TmpXps'); f.write(','); f.write('Fcl')
            f.write(','); f.write('LngFcl'); f.write(','); f.write('Sns')
            f.write(','); f.write('Lmn'); f.write(','); f.write('PstFlsh')
            f.write(','); f.write('ChmCmpPht')
            f.write('\n')
            f.write(str(cfpht)); f.write(','); f.write(chmpht); f.write(','); f.write(nmpht)
            f.write(','); f.write(xtnpht); f.write(','); f.write(marque); f.write(',')
            f.write(mdl); f.write(','); f.write(tpbjc); f.write(','); f.write(str(dtpht))
            f.write(','); f.write(str(hrpht)); f.write(','); f.write(dmspht);f.write(',')
            f.write(str(tmpxps)); f.write(','); f.write(fcl);f.write(','); f.write(lngfcl)
            f.write(','); f.write(str(iso)); f.write(','); f.write(str(lmn));f.write(',')
            f.write(pstfls); f.write(','); f.write(chmcmppht)

    Le message d' erreur est:

    "Erreur d' exécution basic
    Une exception c' est produite:
    Type: com.sun.star.uno.RuntimeException
    Message: Error during function slcpht in module file:///
    home/elfouste/.config/libreoffice/4/user/Scripts/python/
    appelmodule.py(<class 'TypeError'>: 'module' object is not callable
    File "/opt/libreoffice6.2/program/pythonscript.py", line 920, in
    invoke
    ret = self.func(*args).)

    Je précise que je débute en python. Ces trois macros fonctionnaient avant le plantage du PC. J' ai ainsi pu classer plus d' un millier de photos.

    Malgré de longue recherche sur internet, je n' arrive pas à résoudre ce problème.

    Cordialement



    • Partager sur Facebook
    • Partager sur Twitter
      19 novembre 2019 à 17:51:45

      Bonsoir,

      J' ai réussi à me dépanner. Tout fonctionne. La macro en basic n' a pas été modifié, elle fonctionnait. Le module appelmodule.py n' existe plus. La macro Basic lance directement le deuxième module.

      Ce dernier est modifié en début de code.

      #!/usr/bin/env python3
      
      from uno import *
      from sys import *
      from exiftool import *
      from os import chdir
      from datetime import datetime
      from fractions import Fraction
      import csv
      
      def fntslc(event=None):
          ctx = XSCRIPTCONTEXT.getComponentContext()
          create = ctx.ServiceManager.createInstance
          dsr = create("com.sun.star.ui.dialogs.OfficeFilePicker")
          dsr.setDisplayDirectory("file:///media/elfouste/El_Casot/Yvon/Phototeque1/A_Trier/")
          dsr.execute()
          fchslc = dsr.Files[0]
      etc....

      Cordialement

      • Partager sur Facebook
      • Partager sur Twitter

      Erreur d' execution Basic

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown