【问题标题】:Python argument types C++ signaturePython 参数类型 C++ 签名
【发布时间】:2011-10-27 14:12:21
【问题描述】:

我有 2 个问题,都与 Python 和 C++ 之间的参数如何混合有关...我有一个 C++ 函数,我从 python 调用它,我的函数需要日期和字符串。

是pythonstr和C++一样

class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >

其次,我的函数需要class boost::gregorian::date 类型的日期,有谁知道我如何在 python 中给出一个日期,以便用正确的签名读取?

帮助非常感谢!我希望这是一个相当简单的问题,我只是对不同类型的签名不是很有经验(这对于我目前连接 Python 和 C++ 的实验来说并不是一个好兆头)!

【问题讨论】:

  • 不,它们不一样。对于初学者来说,Python 对象携带 GC 和类型信息,并以完全不同的方式存储它们的属性。只要这些值跨越语言障碍,就可以转换,但这取决于如何混合 Python 和 C++(Boost::Python?使用 C API?) .

标签: c++ python types signature


【解决方案1】:

假设您使用的是boost::python,让我告诉您在这些情况下如何进行操作。与其让boost::python 自动包装您的函数,不如提供自己的包装:

    namespace {

        void Foo_methodUsingDate( Foo* pointer, const object& dateObject )
        {
            boost::gregorian::date date = convertFromPython( dateObject );

            pointer->methodUsingDate( date );
        }
    }

    void wrap_Foo()
    {
        class_< Foo >( "Foo" )
            .def( "bar",
                & Foo::bar
                )
            .def( "foobar",
                & Foo::foobar
                )
            .def( "methodUsingDate",
                & Foo_methodUsingDate
                )
            ;
    }

当然,您需要提供一个将boost::python::object 转换为boost::gregorian::date 对象的方法。你必须决定如何处理这个问题。例如,您可以假设参数是三个整数的序列,或者您可以允许以更复杂的方式传递参数,或者定义一个新类来包装公历日期及其所有方法并将其直接公开给 Python。

至于你的第一个问题,当使用boost::pythonstd::strings 时会自动转换为 Python 字符串。

【讨论】:

    【解决方案2】:

    没有。为了从 C 或 C++ 调用 Python 函数,您必须使用 Python C API。对于 C++ 字符串,这意味着首先 使用 PyString_FromStringAndSize( cppString.data(), cppString.size() ) 将其转换为 Python 字符串,并传入结果 对象。如果你想调用任意函数,你必须 使用PyImport_Import 加载模块,然后使用PyObject_GetAttrString 获取函数(Python函数是属性,就像 其他所有内容),然后使用PyObject_CallObject 调用它,之后 转换了所有参数并将它们放在一个元组中(全部通过 Python C API 中的函数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-04
      • 2023-03-26
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多