Appel de Basic depuis Python

Il est possible d'appeler des routines LibreOffice Basic depuis un script Python, et de profiter de fonctions telles que :

L'interface de programmation d'applications (Application Programming Interface ou API) LibreOffice et son cadre de script prend en charge l'exĂ©cution de scripts inter-langages entre Python et Basic, ou d'autres langages de programmation pris en charge . Les arguments peuvent ĂȘtre transmis dans les deux sens Ă  travers des appels, Ă  condition qu'ils reprĂ©sentent des types de donnĂ©es que les deux langages reconnaissent et en supposant que le cadre de script les convertit de maniĂšre appropriĂ©e.

tip

Il est recommandé d'avoir une bonne connaissance des modules standard Python et des fonctionnalités de l'API LibreOffice avant d'effectuer des appels inter-langages de Python vers Basic, JavaScript ou tout autre moteur de script.


warning

Lors de l'exĂ©cution de scripts Python Ă  partir d'un environnement de dĂ©veloppement intĂ©grĂ© (IDE), le moteur Basic intĂ©grĂ© LibreOffice peut ĂȘtre absent. Évitez les appels Python vers LibreOffice Basic dans un tel contexte. Voir Configurer un Environnement de DĂ©veloppement IntĂ©grĂ© (EDI) pour Python


Récupération de scripts Basic LibreOffice

Les macros LibreOffice Basic peuvent ĂȘtre personnelles, partagĂ©es ou intĂ©grĂ©es dans des documents. Pour les exĂ©cuter, le Runtime Python doit ĂȘtre fourni avec les emplacements des macros Basic. Mettre en Ɠuvre l'interface com.sun.star.script.provider.XScriptProvider permet la rĂ©cupĂ©ration de scripts exĂ©cutables.


		 import uno
		 from com.sun.star.script.provider import Xscript
		     
		 def getBasicScript(macro='Main', module='Module1', library='Standard',
		         isEmbedded=False) -> XScript:
		     '''Récupérer l'objet script Basic avant l'invocation.'''
		     ctx = uno.getComponentContext()
		     smgr = ctx.ServiceManager
		     if isEmbedded:
		         desktop = smgr.createInstanceWithContext('com.sun.star.frame.Desktop', ctx)
		         scriptPro = desktop.CurrentComponent.getScriptProvider()
		         location = "document"
		     else:
		         mspf = smgr.createInstanceWithContext(
		             "com.sun.star.script.provider.MasterScriptProviderFactory", ctx)
		         scriptPro = mspf.createScriptProvider("")
		         location = "application"
		     scriptName = "vnd.sun.star.script:"+library+"."+module+"."+macro+ \
		                  "?language=Basic&location="+location
		     xScript = scriptPro.getScript(scriptName)
		     return xScript
		 

Exécuter des scripts LibreOffice Basic

La documentation du Software Development Kit (SDK) LibreOffice pour l'interfacecom.sun.star.script.provider.XScript détaille la convention d'appel pour les appels inter-langages. L'invocation de fonctions nécessite trois tableaux :

Syntaxe Python

results = script.invoke((prompt,buttons,title), (), ())

script.invoke((message,), tuple, ())

script.invoke((args), (), results)

Exemples de scripts personnels ou partagés

Les exemples dans Input/Output to Screen détaillent des appels Python vers Basic. Monitoring Document Events illustre l'utilisation de l'idiome Python *args pour imprimer un nombre variable de paramÚtres dans la boßte de dialogue de la console de journalisation Access2Base .

tip

Au moment du développement, vous pouvez interrompre l'exécution du script Python en utilisant Xray extension afin d'inspecter les propriétés et les méthodes des objets UNO. L' extension débogueur APSO permet l'introspection d'objets à l'aide des extensions Xray ou MRI.



	  def xray(myObject):
	  	  script = getBasicScript(library="XrayTool", module="_Main", macro="Xray")
	  	  script.invoke((myObject,), (), ())
	  

Exemples de scripts intégrés dans des documents

La syntaxe simplifiĂ©e *argsPython peut ĂȘtre utilisĂ©e conjointement avec les routines LibreOffice Basic qui acceptent un nombre variable d'arguments. Ci-dessous les fonctions Python Print et SUM appellent leurs homologues Basic Print et SUM, en utilisant la fonction getBasicScript susmentionnĂ©e. La gestion des exceptions n'est pas dĂ©taillĂ©e.


	  # -*- coding: utf-8 -*-
	  from __future__ import unicode_literals
	      
	  def Print(*args):
	      """GénÚre les chaßnes ou expressions numériques spécifiées dans une boßte de dialogue."""
	      xScript = getBasicScript("Print", "Scripting", embedded=True)
	      xScript.invoke((args), (), ())
	      
	  def SUM(*args):
	      """SUM l'expression numérique spécifiée."""
	      xScript = getBasicScript("SUM", "Scripting", embedded=True)
	      res = xScript.invoke((args), (), ())
	      return res[0]
	      
	  # def getBasicScript()  # see above
	      
	  def playWithArgs():
	      Print("Fun with *args ", -9.81, 297864.681974, 8762E-137)
	      Print(SUM(45, -9.81, 297864.681974))
	      Print(SUM(45, -9.81, 297864.681974, 8762E+137))
	      
	  g_exportedScripts = (playWithArgs,)
	  

Les routines LibreOffice Basic Print et SUM basées sur les documents acceptent un nombre variable d'arguments. Les attributs Private ou Public n'ont aucun effet. La vérification du type d'arguments est ignorée pour plus de clarté.


	  Option Compatible ' "Standard.Scripting" module
	  Option Explicit
	      
	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
	      ''' Imprimer la liste des éléments du numéro de variable '''
	      ' tous les arguments convertibles CStr() sont acceptés
	      Dim str As String, i As Integer
	      If UBound(args) >= 0 Then
	          For i = 0 To UBound(args)
	              str = str + Cstr(args(i))+ sep 
	          Next i
	      End If
	      Print str
	      End Sub ' Standard.Scripting.Print()
	      
	  Public Function SUM(ParamArray args() As Variant) As Variant
	      ''' SUM une liste variable de nombres'''
	      Dim ndx As Integer
	      If UBound(args) >= 0 Then
	          For ndx = 0 To UBound(args)
	              SUM = SUM + args(ndx)
	          Next ndx
	      End If
	  End Function ' Standard.Scripting.SUM()
	  

Aidez-nous !