如何强制Swig在模块的帮助页面中生成适当的参数列表?

时间:2019-03-15 14:43:07

标签: python swig pydoc

help生成的模块的SWIG页不是很有帮助。实际上,它甚至没有列出每个函数的参数。

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)

问题:有一种方法可以告诉swig(使用某些选项)至少 包括每个函数的命名参数的确切列表?

我至少希望得到以下内容:

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

通常也欢迎更高质量的文档。

我知道,如果将原始函数foo重命名为_foo,然后手动定义一个新的foo(),则可以获得此结果。但是,还有其他一些系统的,内置的方法可以达到相同的目的吗?


这是我执行的命令列表,摘自tutorial

 ~$ 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 

文件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);
 }

文件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();

2 个答案:

答案 0 :(得分:1)

请参阅SWIG文档中的36.10 Docstring Features

尤其是autodoc功能可以很好地配合您的示例。只需使用:

swig -python -features autodoc example.i

示例输出:

>>> 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

答案 1 :(得分:1)

另一种替代方法是使用doxy2swig.py,例如http://github.com/m7thon/doxy2swig

使用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();

接口文件example.i

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

 %include "documentation.i"

 %include "example.h"

要进行SWIG和编译,请执行以下操作。当然,如果愿意,可以使用automake或CMake很好地进行设置。

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

在Python中,文档显示为

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 *

它可以概括为类的文档,并且非常灵活。