La page help d'un module généré avec SWIG n'est pas très utile. En fait, il ne répertorie même pas les arguments de chaque fonction.

Help on module example:

NAME
    example

FILE
    /home/anon/example.py

DESCRIPTION
    # This file was automatically generated by SWIG (http://www.swig.org).
    # Version 3.0.12
    #
    # Do not make changes to this file unless you know what you are doing--modify
    # the SWIG interface file instead.

FUNCTIONS
    fact(...)

    get_time(...)

    my_mod(...)

DATA
    cvar = <Swig global variables>

(END)

Question : existe-t-il un moyen de dire à swig --avec quelques options-- d'au moins inclure la liste exacte des arguments nommés de chaque fonction ?

J'aimerais obtenir au moins quelque chose comme suit :

...
fact(n)
...
my_mod(x, y)
...

Un niveau de documentation de meilleure qualité en général serait également le bienvenu.

Je sais que je peux obtenir ce résultat si je renomme une fonction d'origine foo en _foo puis que je définis manuellement une nouvelle foo(). Mais existe-t-il une autre approche, systématique et intégrée, qui atteint le même objectif ?


Voici la liste des commandes que j'ai exécutées, extraite de ce tutoriel :

 ~$ swig -python example.i
 ~$ gcc -fPIC -c example.c example_wrap.c \
        -I/usr/include/python2.7
 ~$ ld -shared example.o example_wrap.o -o _example.so 

Fichier example.c :

 /* File : example.c */

 #include <time.h>
 double My_variable = 3.0;

 int fact(int n) {
     if (n <= 1) return 1;
     else return n*fact(n-1);
 }

 int my_mod(int x, int y) {
     return (x%y);
 }

 char *get_time()
 {
     time_t ltime;
     time(&ltime);
     return ctime(&ltime);
 }

Fichier example.i :

 /* example.i */
 %module example
 %{
 /* Put header files here or function declarations like below */
 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();
 %}

 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();
1
Patrick Trentin 15 mars 2019 à 17:43

2 réponses

Meilleure réponse

Voir les 36.10 Docstring Features dans la documentation SWIG.

En particulier, la fonctionnalité autodoc fonctionne bien avec votre exemple. Utilisez simplement :

swig -python -features autodoc example.i

Exemple de sortie:

>>> import example
>>> help(example)
Help on module example:

NAME
    example

DESCRIPTION
    # This file was automatically generated by SWIG (http://www.swig.org).
    # Version 3.0.12
    #
    # Do not make changes to this file unless you know what you are doing--modify
    # the SWIG interface file instead.

FUNCTIONS
    fact(n)
        fact(int n) -> int

    get_time()
        get_time() -> char *

    my_mod(x, y)
        my_mod(int x, int y) -> int

DATA
    cvar = <Swig global variables>

FILE
    c:\example\example.py
2
Mark Tolonen 15 mars 2019 à 16:40

Une autre alternative consiste à utiliser doxy2swig.py, voir par ex. http://github.com/m7thon/doxy2swig

En-tête utilisant doxygen example.h

#pragma once

extern double My_variable; ///< My variable for something

/**
 * Factorial function
 *
 * @param n
 *
 * @return n!
 */
extern int fact(int n);

/**
 * Module function
 *
 * @param x
 * @param y
 *
 * @return
 */
extern int my_mod(int x, int y);

/**
 * Get the current time
 *
 *
 * @return string representation of time
 */
extern char *get_time();

Fichier d'interface example.i

 %module example
 %{
 /* Put header files here or function declarations like below */
 #include "example.h"
 %}

 %include "documentation.i"

 %include "example.h"

Pour SWIG et compiler, procédez comme suit. Cela peut bien sûr être configuré en utilisant automake ou CMake si l'on préfère.

doxygen -g
sed -i 's/GENERATE_XML           = NO/GENERATE_XML = YES/g' Doxyfile
python doxy2swig.py -c -a ./xml/index.xml documentation.i
swig -python example.i
gcc -fPIC -c example.c example_wrap.c -I/usr/include/python2.7
ld -shared example.o example_wrap.o -o _example.so

En Python, la documentation apparaît comme

In [1]: import example
In [2]: help(example.get_time)

Help on function get_time in module example:

get_time()
    Get the current time

    Returns
    -------
    string representation of time

        get_time() -> char *

Il se généralise à la documentation des classes et il est assez flexible.

1
Jens Munk 20 mars 2019 à 20:44