Arrêter une macro python à la fin de l' exécution.

Arrêter une macro python à la fin de l' exécution. - Python - Programmation

Marsh Posté le 15-06-2019 à 21:26:05    

Bonsoir,
 
Toujours en cours de développement sur une macro, je rencontre un problème embarrassant. Après avoir lancé la macro, La fenêtre de sélection d' un fichier s' ouvre normalement et après sélection d' une photo, les données exif sont bien récupérées. Toutefois, au lieu que la procédure s' arrête à la dernière ligne du programme, la fenêtre de sélection  se rouvre.
Pour éviter cet inconvénient, j' ai voulu utiliser la commande sys.exit() mais cela ne fonctionne pas.
Pourriez-vous m' expliquer pourquoi?
Code de la macro:

Code :
  1. #!/usr/bin/env python3
  2. from uno import *
  3. from exiftool import *
  4. from datetime import datetime
  5. from fractions import *
  6. import sys
  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. dtpht = ' ';hrpht = ' '; exp = ' '; vlrfcl = ' '; vlrlngfcl = ' '; vrtbjc = ' '
  18. pstfls = ' '; tpbjc = ' '
  19. def dnxf():
  20.     # Extraction de la date et de l' heure de prise de vue
  21.     dt = datetime.strptime(dtcrt,"%Y:%m:%d %H:%M:%S" )
  22.     global dtpht; global hrpht
  23.     dtpht = dt.strftime('%d-%m-%Y')
  24.     hrpht = dt.strftime('%H:%M:%S')
  25.     # Temps d' exposition
  26.     global exp
  27.     #x = int(1 / tmpxps)
  28.     #exp = Fraction(1, x)
  29.     # Valeur de focale
  30.     global vlrfcl
  31.     vlrfcl = 'f '+ str(round(fcl, 1))
  32.     global vlrlngfcl
  33.     vlrlngfcl = str(lngfcl)+ ' mm'
  34.     global tpbjc
  35.     if bjc == 53:
  36.         tpbjc = 'Canon EF-S 18-55mm f/3.5-5.6 III'
  37.     elif bjc == 39:
  38.         tpbjc = 'Canon EF 75-300mm f/4-5.6'
  39.     else:
  40.         tpbjc = 'Inconnu'
  41.     global vrtbjc
  42.     #y = vrt
  43.     #vrtbjc = format(y, '0.1f')
  44.     # Valeur de flash
  45.     global pstfls
  46.     if flash == 16:
  47.         pstfls = 'Inactif'
  48.     else:
  49.         pstfls = 'Actif'
  50. #Ouverture de la fenêtre de sélection d' un fichier
  51. fntslc()
  52. # Recherche des balises du chemin du fichier
  53. bls = '/'
  54. pstbls = fchslc.rfind(bls,0,10)
  55. xbls = fchslc.count(bls)
  56. i = 0
  57. while i <= xbls:
  58.     pstbls1 = fchslc.rfind(bls)
  59.     i = i + 1
  60. bls2 = '.'
  61. pstbls2 = fchslc.rfind(bls2)
  62. # Chemin du fichier
  63. chmfch = fchslc[pstbls:pstbls1 + 1]
  64. # Nom de la photo
  65. nmpht = fchslc[pstbls1 + 1:pstbls2]
  66. # Type d' extention du fichier
  67. xtn = fchslc[pstbls2 + 1:]
  68. #Extraction du fabricant de l' appareil
  69. chmfchslc = fchslc[pstbls:]
  70. with ExifTool() as e:
  71.     marque = e.get_tag('Make', chmfchslc)
  72. if marque == None:
  73.     print ("Il n' y a pas de données exif pour cette photographie !" )
  74.     marque = 'Inconnue'; mdl = 'Inconnue'; dtpht = 'Inconnue'; hrpht = 'Inconnue'
  75.     dmspht = 'Inconnue'; tmpxps = 'Inconnue'; fcl = 'Inconnue'; lngfcl = 'Inconnue'
  76.     iso = 'Inconnue'; vrtbjc = 'Inconnue'; lmn = 'Inconnue'; flash = 'Inconnue'
  77.     bjc = 'Inconnue'
  78. elif marque == 'Canon':
  79.     with ExifTool() as e:
  80.         mdl = e.get_tag('Model', chmfchslc)  # Modèle appareil
  81.         dtcrt = e.get_tag('DateTimeOriginal', chmfchslc)# Date et heure prise de vue
  82.         dmspht = e.get_tag('ImageSize', chmfchslc) # Dimension de la photo
  83.         tmpxps = e.get_tag('ExposureTime', chmfchslc) # Temps d' exposition
  84.         fcl = e.get_tag('FNumber', chmfchslc)  # Focale
  85.         lngfcl = e.get_tag('FocalLength', chmfchslc) # Longueur de focale
  86.         iso = e.get_tag('Iso', chmfchslc)  # Sensibilité
  87.         vrt = e.get_tag('ApertureValue', chmfchslc) # Ouverture objectif
  88.         lmn = e.get_tag('LightValue', chmfchslc)  # Luminosité
  89.         flash = e.get_tag('Flash', chmfchslc)  # Position flash
  90.         bjc = e.get_tag('LensType', chmfchslc)  # Objectif utilisé
  91.         dnxf()
  92. elif marque == 'FUJIFILM':
  93.     with ExifTool() as e:
  94.         mdl = e.get_tag('Model', chmfchslc)  # Modèle appareil
  95.         dtcrt = e.get_tag('DateTimeOriginal', chmfchslc)# Date et heure prise de vue
  96.         dmspht = e.get_tag('ImageSize', chmfchslc) # Dimension de la photo
  97.         tmpxps = e.get_tag('ExposureTime', chmfchslc) # Temps d' exposition
  98.         fcl = e.get_tag('FNumber', chmfchslc)  # Focale
  99.         lngfcl = e.get_tag('FocalLength', chmfchslc) # Longueur de focale
  100.         iso = e.get_tag('Iso', chmfchslc)  # Sensibilité
  101.         vrt = e.get_tag('ApertureValue', chmfchslc) # Ouverture objectif
  102.         lmn = e.get_tag('LightValue', chmfchslc)  # Luminosité
  103.         flash = e.get_tag('Flash', chmfchslc)  # Position flash
  104.         bjc = e.get_tag('LensType', chmfchslc)  # Objectif utilisé
  105.         dnxf()
  106. else:
  107.     with ExifTool() as e:
  108.         mdl = e.get_tag('Model', chmfchslc)  # Modèle appareil
  109.         dtcrt = e.get_tag('DateTimeOriginal', chmfchslc)# Date et heure prise de vue
  110.         dmspht = e.get_tag('ImageSize', chmfchslc) # Dimension de la photo
  111.         tmpxps = e.get_tag('ExposureTime', chmfchslc) # Temps d' exposition
  112.         fcl = e.get_tag('FNumber', chmfchslc)  # Focale
  113.         lngfcl = e.get_tag('FocalLength', chmfchslc) # Longueur de focale
  114.         iso = e.get_tag('Iso', chmfchslc)  # Sensibilité
  115.         vrt = e.get_tag('ApertureValue', chmfchslc) # Ouverture objectif
  116.         lmn = e.get_tag('LightValue', chmfchslc)  # Luminosité
  117.         flash = e.get_tag('Flash', chmfchslc)  # Position flash
  118.         bjc = e.get_tag('LensType', chmfchslc)  # Objectif utilisé
  119.         dnxf()
  120. # Creation du fichier de sauvegarde
  121. chdir('/home/elfouste/Documents/Python/MacroPython/Tst_Fch')
  122. fch = 'FchDn.txt'
  123. with open('FchDn.txt', 'w') as fch:
  124.     fch.write(chmfch)
  125.     fch.write(' - ')
  126.     fch.write(nmpht)
  127.     fch.write(' - ')
  128.     fch.write(xtn)
  129.     fch.write(' - ')
  130.     fch.write(marque)
  131.     fch.write(' - ')
  132.     fch.write(mdl)
  133.     fch.write(' - ')
  134.     fch.write(dtpht)
  135.     fch.write(' - ')
  136.     fch.write(hrpht)
  137.     fch.write(' - ')
  138.     fch.write(str(dmspht))
  139.     fch.write(' - ')
  140. #    fch.write(str(exp))
  141.     fch.write(' - ')
  142.     fch.write(str(vlrfcl))
  143.     fch.write(' - ')
  144.     fch.write(str(vlrlngfcl))
  145.     fch.write(' - ')
  146.     fch.write(str(iso))
  147.     fch.write(' - ')
  148.     fch.write(str(tpbjc))
  149.     fch.write(' - ')
  150. #    fch.write(str(vrtbjc))
  151. #    fch.write(str(lmn))
  152.     fch.write(' - ')
  153.     fch.write(pstfls)
  154. sys.exit()


 
Cordialement

Reply

Marsh Posté le 15-06-2019 à 21:26:05   

Reply

Marsh Posté le 17-06-2019 à 08:54:50    

Tu devrais *vraiment* faire un effort sur le nom de tes variables et les rendre plus explicites. En l'état actuel des choses, ton source est tout simplement illisible.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 19-06-2019 à 20:35:36    

Bonsoir,
 
J' ai tardé à répondre car j' ai reconstruit la macro pour la rendre plus lisible. En fait, depuis de nombreuses années, j' utilise une codification simpliste mais qui m' évite bien des erreurs de saisis. Pour chaque variable utilisé, je conserve uniquement les trois premières consonnes de chaque mot spécifiant cette variable. Je reconnais que cela peut-être perturbant surtout lorsque, comme dans le cas présent, j' ai besoin de votre aide. Voici donc le code remanié en espérant que cela vous permettra de trouver le bug.

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. fichierselectionne = ' '
  10. def fenetreselection(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 fichierselectionne
  16.     fichierselectionne = filepicker.Files[0]
  17. dimensionphoto = ' '; datephoto = ' ';heurephoto = ' '; exposition = ' '
  18. ouvertureobjectif = ' ';flash = ' '
  19. def donneesexif():
  20.     # Dimension de la photo
  21.     global dimensionphoto
  22.     dimensionphoto = lrg, ' x ',htr
  23.     # Extraction de la date et de l' heure de prise de vue
  24.     date = datetime.strptime(dtcrt,"%Y:%m:%d %H:%M:%S" )
  25.     global datephoto; global heurephoto
  26.     datephoto = date.strftime('%d-%m-%Y')
  27.     heurephoto = date.strftime('%H:%M:%S')
  28.     # Temps d' exposition
  29.     global exposition
  30.     #x = int(1 / tmpxps)
  31.     #exp = Fraction(1,x)
  32.     #exp = Fraction(1,x)
  33.     global ouvertureobjectif
  34.     ouvertureobjectif = format(ouverture, '0.1f')
  35.     # Flash actif
  36.     global flash
  37.     if flash == 16:
  38.         flash = 'Inactif'
  39.     else:
  40.         flash = 'Actif'
  41. fenetreselecion()   #Ouverture de la fenêtre de sélection d' un fichier
  42. # Recherche des balises du chemin du fichier
  43. balise = '/'
  44. positionbalise = fichierselectionne.rfind(balise,0,10)
  45. nombrebalise = fichierselectionne.count(balise)
  46. i = 0
  47. while i <= nombrebalise:
  48.     positionbalise1 = fichierselectionne.rfind(balise)
  49.     i = i + 1
  50. balise2 = '.'
  51. pstbls2 = fichierselectionne.rfind(balise2)
  52. # Chemin du fichier
  53. cheminfichier = balise2[positionbalise:positionbalise1 + 1]
  54. # Nom de la photo
  55. nomphoto = fichierselectionne[positionbalise1 + 1:positionbalise2]
  56. # Type d' extention du fichier
  57. extension = fichierselectionne[positionbalise2 + 1:]
  58. #Extraction du fabricant de l' appareil
  59. cheminfichierselectionne = fichierselectionne[positionbalise:]
  60. with ExifTool() as e:
  61.     marque = e.get_tag('Make', positionbalise)
  62. # Sélection de la procédure en fonction du fabricant de l' appareil
  63. if marque == None:
  64.     print ("Il n' y a pas de données exif pour cette photographie !" )
  65.     marque = 'Inconnue'; modele = 'Inconnue'; datephoto = 'Inconnue'
  66.     heurephoto = 'Inconnue'; dimensionphoto = 'Inconnue'; tempsexposition = 'Inconnue'
  67.     focale = 'Inconnue'; longueurfocale = 'Inconnue'; iso = 'Inconnue'
  68.     ouvertureobjectif = 'Inconnue'; luminosite = 'Inconnue'; flash = 'Inconnue'
  69.     objectif = 'Inconnue'
  70. elif marque == 'Canon':
  71.     with ExifTool() as e:
  72.         modele = e.get_tag('Model', cheminfichierselectionne)  # Modèle appareil
  73.         datecreation = e.get_tag('DateTimeOriginal', cheminfichierselectionne)# Date et heure prise de vue
  74.         largeur = e.get_tag('ImageWidth', cheminfichierselectionne) # Largeur photo
  75.         hauteur = e.get_tag('ImageHeight', cheminfichierselectionne) # Hauteur photo
  76.         tempsexposition = e.get_tag('ExposureTime', cheminfichierselectionne)# Temps d' exposition
  77.         focale = e.get_tag('FNumber', cheminfichierselectionne)  # Focale
  78.         longfocale = e.get_tag('FocalLength', cheminfichierselectionne) # Longueur de focale
  79.         iso = e.get_tag('Iso', cheminfichierselectionne)  # Sensibilité
  80.         ouverture = e.get_tag('ApertureValue', cheminfichierselectionne)# Ouverture objectif
  81.         luminosite = e.get_tag('LightValue', cheminfichierselectionne)  # Luminosité
  82.         flash = e.get_tag('Flash', cheminfichierselectionne)  # Position flash
  83.         objectif = e.get_tag('lenstype', cheminfichierselectionne) # Objectif utilisé
  84.         donneesexif()
  85. elif marque == 'FUJIFILM':
  86.     with ExifTool() as e:
  87.         modele = e.get_tag('Model', cheminfichierselectionne)  # Modèle appareil
  88.         datecreation = e.get_tag('DateTimeOriginal', cheminfichierselectionne)# Date et heure prise de vue
  89.         largeur = e.get_tag('ImageWidth', cheminfichierselectionne) # Largeur photo
  90.         hauteur = e.get_tag('ImageHeight', cheminfichierselectionne) # Hauteur photo
  91.         tempsexposition = e.get_tag('ExposureTime', cheminfichierselectionne)# Temps d' exposition
  92.         focale = e.get_tag('FNumber', cheminfichierselectionne)  # Focale
  93.         longfocale = e.get_tag('FocalLength', cheminfichierselectionne) # Longueur de focale
  94.         iso = e.get_tag('Iso', cheminfichierselectionne)  # Sensibilité
  95.         ouverture = e.get_tag('ApertureValue', cheminfichierselectionne)# Ouverture objectif
  96.         luminosite = e.get_tag('LightValue', cheminfichierselectionne)  # Luminosité
  97.         flash = e.get_tag('Flash', cheminfichierselectionne)  # Position flash
  98.         objectif = e.get_tag('lenstype', cheminfichierselectionne) # Objectif utilisé
  99.         donneesexif()
  100. else:
  101.     with ExifTool() as e:
  102.         modele = e.get_tag('Model', cheminfichierselectionne)  # Modèle appareil
  103.         datecreation = e.get_tag('DateTimeOriginal', cheminfichierselectionne)# Date et heure prise de vue
  104.         largeur = e.get_tag('ImageWidth', cheminfichierselectionne) # Largeur photo
  105.         hauteur = e.get_tag('ImageHeight', cheminfichierselectionne) # Hauteur photo
  106.         tempsexposition = e.get_tag('ExposureTime', cheminfichierselectionne)# Temps d' exposition
  107.         focale = e.get_tag('FNumber', cheminfichierselectionne)  # Focale
  108.         longfocale = e.get_tag('FocalLength', cheminfichierselectionne) # Longueur de focale
  109.         iso = e.get_tag('Iso', cheminfichierselectionne)  # Sensibilité
  110.         ouverture = e.get_tag('ApertureValue', cheminfichierselectionne)# Ouverture objectif
  111.         luminosite = e.get_tag('LightValue', cheminfichierselectionne)  # Luminosité
  112.         flash = e.get_tag('Flash', cheminfichierselectionne)  # Position flash
  113.         objectif = e.get_tag('lenstype', cheminfichierselectionne) # Objectif utilisé
  114.         donneesexif()
  115. # Creation du fichier de sauvegarde
  116. chdir('/home/elfouste/Documents/Python/MacroPython/Tst_Fch')
  117. fch = 'FchDn.txt'
  118. with open('FchDn.txt', 'w') as fch:
  119.     fch.write(cheminfichier)
  120.     fch.write(nomphoto)
  121.     fch.write(extention)
  122.     fch.write(datephoto)
  123.     fch.write(heurephoto)
  124.     fch.write(marque)
  125.     fch.write(modele)
  126.     fch.write(str(dimensionphoto))
  127.     fch.write(str(tempsexposition))
  128.     fch.write(str(focale))
  129.     fch.write(str(longueurfocale))
  130.     fch.write(str(iso))
  131.     fch.write(str(objectif))
  132.     fch.write(str(ouvertureobjectif))
  133.     fch.write(str(luminosite))
  134.     fch.write(str(flash))
  135. #sys.exit()


Par avance, merci de votre aide.
 
Cordialement

Reply

Marsh Posté le 21-06-2019 à 14:02:51    

Bonjour,
Je suis toujours en panne. La macro, suivant les versions ci-dessus fonctionne. Le fichier texte contient toutes les réponses aux questions. Toutefois, pas moyen d' arrêter cette macro.  
J' ai utilisé:
quit(),  exit(),  sys.exit(), sys.exit(0) et os._exit()
sans succès.
Le programme ce déroule normalement. Le fichier texte est bien créer. Par contre, à chaque fois, la fenêtre de sélection se rouvre et j' ai toujours le même message d' erreur.
Pourriez-vous me dire ce que je fais de mal?
Cordialement.

Reply

Marsh Posté le 21-06-2019 à 15:12:04    

Tu lances ce script comment?

Reply

Marsh Posté le 21-06-2019 à 18:21:13    

Bonsoir,
 
Le script est lancé par un bouton situé sur un formulaire LibreOffice Base.  
 
Cordialement

Reply

Marsh Posté le 21-06-2019 à 18:59:11    

Si tu fais un script tout simple avec juste un message tu as le même problème? Dans ce cas ça vient de LO et il faut chercher par là.

Reply

Marsh Posté le 28-06-2019 à 17:42:52    

Bonjour,
 
J' ai enfin trouvé. Par contre, ne me demandez pas d' explication car je n' ai aucune réponse sensée. La seule chose que je peux dire c' est que le problème vient de LO Base. Arbitrairement, le script se lance à l' ouverture de LO. Même si rien ne s' affiche,  faire appel à la fonction de fntslc() ne sert à rien et provoque le bug mentionné. En supprimant cette ligne de commande et en lançant le script depuis le formulaire, tout se déroule bien. Pourquoi, mystère et boule de gomme.
 
Cordialement.

Reply

Sujets relatifs:

Leave a Replay

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