Scripts Python#

Splash a la possibilité d’être scripté en utilisant Python. Cela donne le même niveau de controle que depuis l’interface utilisateur, ce qui signifie que tous les types d’objet peuvent être modifiés, créés et supprimés, exception faite des Scenes du fait d’une limitation interne. Cela peut être utilisé pour ajouter tout type de contrôle à Splash : une nouvelle interface, un serveur HTTP, Websocket ou OSC, de l’automatisation, …

Vous pouvez spécifer un script que Splash lancera au démarrage depuis la ligne de commande. Tout argument suivant le -- sera envoyé au script en tant que paramètres :

splash -P script.py config.json -- --pyArg1 value --pyArg2 ...

Le script définit trois différents callbacks - splash_init() : appelé une fois, initialise le script - splash_loop() : appelé à chaque boucle - splash_stop() : appelé une fois, termine le script

Deux exemples sont inclus avec les sources de Splash, dans le sous-répertoire addons/python : httpServer.py et repl.py. Le second est particulièrement intéressant puisqu’il crée une console Python interactive, semblable à n’importe quelle autre console Python. Chargez le avec Splash, et tapez les commandes suivantes pour avoir plus d’information au sujet de l’API Python de Splash :

help(splash)

Pour l’instant, le scriptage de Splash ne supporte pas les environnements virtuels, vous devez donc installer globalement toutes les librairies utilisées dans votre script.

Modifier le graphe de Splash#

Il est possible de modifier le graphe de Splash (ajouter ou supprimer un objet, relier deux objets, …) en utilisant l’objet world avec la méthode set_world_attribute.

Par exemple pour ajouter un objet de type Camera :

splash.set_world_attribute("addObject","camera")

Callback des attributs#

Il est possible de spécifier des callbacks sur les attributs de Splash, qui sont appelé dès lors que la valeur de cet attribut est modifié. C’est fait à travers deux méthodes : splash.register_attribute_callback et splash.unregister_attribute_callback. Le script suivant donne un aperçu de comment les utiliser :

def callback(object, attribute):
    print("Modified attribute {} of object {}".format(attribute, object))

# Set the callback and get its id, for the attribute "flip" of object "image"
attribute_id = splash.register_attribute_callback("image", "flip", callback)

# Modify the "flip" attribute of the "image" object. You should see the following:
# Modified attribute flip of object image

# Unregister the attribute
splash.unregister_attribute_callback(attribute_id)

Un callback est appelé après que la valeur d’un attribut est changé dans l’arbre de Splash, mais les changements ne sont appliqué que après que le callback ait été appelé. Par exemple, si vous définissez un callback sur l’attribut flip de l’objet image, le callback sera appelé après que l’attribut flip ait sa nouvelle valeur, mais avant que la texture ne soit effectivement inversée. C’est du à la manière dont les changements des attributs sont propagés à travers les processus et instances de Splash.

Donc si vous voulez appeler une fonction une fois que les changements sont appliqués, vous devrez le faire dans la boucle principale après avoir activé un interrupteur dans le callback.

Par exemple :

trigger = False

def callback(object, attribute):
    global trigger
    trigger = True

def splash_loop():
    global trigger
    if trigger:
       trigger = False
       # Do whatever you want in here

Il peut être utile d’attendre un peu (en utilisant time.sleep par exemple) pour être certain que les changements ont été appliqués.

Capture d’image rendues#

Si vous voulez capturer des images dans votre script, il est possible d’ajouter et lier un sink avec la classe Sink.

sink = splash.Sink() # Creates an instance of type Sink and a object in the graph
sink.link_to("window_1_cam1_warp")
sink.open() # Open the sink, which will start reading the input image

frame = sink.grab() # Grab the latest image from the sink

Par défaut les dimensions des Sink sont de 512x512, vous pouvez vouloir les modifier avec la méthode set_size avant de capturer la sortie.

La méthode grab renvoie la dernière image sous forme d’un bytearray.