更改 Python swigged C 函数的返回值类型

Posted

技术标签:

【中文标题】更改 Python swigged C 函数的返回值类型【英文标题】:Change return value type of Python swigged C function 【发布时间】:2018-06-29 18:28:58 【问题描述】:

我有一个 C++ 函数

Version getVersion() return Version("1.2.3.5");

其中 Version 是一个类,包含“版本信息”,例如

class Version

    public:
                                                Version(const string& version = gEmptyString);
        bool                                    parse(const string& input);
        int                                     getMajor() const;
        int                                     getMinor() const;
        int                                     getPatch() const;
        int                                     getBuild() const;
        string                                  asString(const string& format = gEmptyString) const;


    private:
        int                                     mMajor;
        int                                     mMinor;
        int                                     mPatch;
        int                                     mBuild;
;

使用 Swig 包装此代码时,Python 用户在调用 getVersion() 函数时会返回一个 Version 对象。

当从 Python 调用时,我想更改 getVersion() 函数的行为。我不想返回 Version 对象,而是想要返回一个字符串,表示 Version 值。

我尝试了以下方法:

%rename(getVersionHidden) getVersion;

%inline %
std::string getVersion()

    Version v = getVersionHidden();
    return v.asString();

%

但这不会编译:

   Error ... Call to undefined function 'getVersionHidden' in function 
   getVersion()
   Error E2285 P:\builds\dsl\wrappers\python\dslPYTHON_wrap.cxx 4434: Could not 
   find a match for 'Version::Version(const Version&)' in function getVersion()
   Error E2015 P:\builds\dsl\wrappers\python\dslPYTHON_wrap.cxx 16893: Ambiguity 
   between 'dsl::getVersion() at P:/libs/dsl/Common\dslCommon.h:8' and 
   'getVersion() at P:\builds\dsl\wrappers\python\dslPYTHON_wrap.cxx:4432' in 
   function _wrap_getVersionHidden(_object *,_object *)

也许使用类型映射是要走的路。我是 Swig 的新手,所以不确定..?

【问题讨论】:

【参考方案1】:

%rename 仅重命名目标语言的函数——也就是说,%rename("getVersionHidden") getVersion; 将创建一个 Python 函数 (getVersionHidden),它转发 C/C++ 中定义的 getVersion()。

相反,您应该创建一个新函数,然后重命名该函数以覆盖否则会自动生成的 getVersion:

%rename("getVersion") _getVersion_Swig;

%inline %
std::string _getVersion_Swig()

    Version v = getVersion();
    return v.asString();

%

【讨论】:

我尝试了你的建议,但现在我得到了编译错误:P:\libs\dsl\wrappers\python\dsl.i(103) : Error: 'getVersion' is multiply defined in the generated target语言模块。 但是,添加一个 %ignore getVersion; %include 之前的语句修复了这个问题!我会把你的答案标记为正确的......

以上是关于更改 Python swigged C 函数的返回值类型的主要内容,如果未能解决你的问题,请参考以下文章

使用python包装的c ++ SWIG模拟输入

使用 SWIG 更改生成的 CS 函数中的返回类型

SWIG 'cstring.i' Python 返回字节类型而不是字符串类型

在 SWIG 中将结构从 C++ 函数返回到 Python

如何使用 Swig 中止调用 C 函数的 Python 脚本?

带有 SWIG 未知长度数组的 NumPy C 扩展