2010-04-17 17 views
2

J'ai une fonction C++ qui est appelée à partir de nombreuses fonctions Python via Boost :: Python. Lorsque la fonction C++ détecte les mauvais arguments, je veux écrire un message de journal et continuer le traitement. Dans ce message de journal je voudrais noter le module Python et le numéro de ligne qui a appelé en C++. Comment puis-je faire ceci?Comment puis-je obtenir le module Python et le numéro de ligne qui appelait ma fonction C++ via Boost :: Python?

Je peux lancer une exception de C++ qui est traduite en une exception Python que je peux attraper, mais qui annule la fonction C++ que je ne peux pas avoir. Par exemple, disons que je veux enregistrer un message d'avertissement si factorial() reçoit un nombre inférieur à un. Ignorer le fait qu'il peut facilement gérer le cas (et fait) - mon patron veut un avertissement de toute façon. ;)

Ce code peut être appelé à partir de Python directement ou à partir d'autres fonctions C++ qui sont appelées à partir de Python afin que la trace de la pile C++ ne soit pas très utile. J'espère que la bibliothèque Boost :: Python fournit cette capacité de C++.

+0

avez-vous déjà trouvé un moyen? Je cherche également à obtenir le numéro de ligne (d'où ma fonction Python a été appelée, sans C++ impliqué) sans lancer une exception – Anentropic

+0

@Anentropic - Tristement, non. :( –

Répondre

0

La chose la plus simple qui me vient à l'esprit est d'envelopper la librairie C++ avec un module python et de faire en sorte que les fonctions python enveloppent les fonctions C++. Vous devez échanger votre nom de module c avec votre module python afin que toutes les fonctions python appellent le module python au lieu du C++.

mv my_cmodule_name.so -> __my_cmodule_name.so (et changer aussi à l'intérieur du code son nom)

#my_cmodule_name.py 

import my_cmodule_name as cmod 
import traceback 

def catchBadArgsDecorator(function): 
    def _inner(*args,**kwds): 
     try: 
      return function(*args, **kdws) 
     except ValueError: 
      _, line, function, _ = traceback.extract_stack()[-1] 
     log("Call to %s(%s) from %[email protected]%d failed" % (function.__name__, str(args), function,line) 
    return _inner 

# for all your modules functions 
myfunction = catchBadArgsDecorator(cmod.myfunction) 

Le code est non testé et peut être améliorée, mais j'espère que vous avez l'idée.

+0

Mais si je comprends bien, cela nécessite toujours que cette fonction jette une exception pour le décorateur à attraper.Ce dont j'ai besoin, c'est que le code C++ enregistre le module Python et la ligne # puis continue le traitement J'ai mis à jour mon original question avec un exemple de ce que je cherche Merci! –