2011-10-27 63 views
1

我有2个问题,既涉及Python和C之间的争论如何++混合...我有C++中的功能,我是从蟒蛇打电话,我的函数将日期和字符串。的Python参数类型C++签名

是一个Python str同一个C++

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

其次,我的功能需要class boost::gregorian::date类型的日期,没有人知道我可以给Python中的日期将与正确的读签名?

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

+2

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

回答

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::string s自动转换为/从Python字符串。

1

号为了调用Python函数从C或C++,你必须使用 Python的C API。在C++串的情况下,这将意味着第一 其转换为一个Python字符串,使用PyString_FromStringAndSize( cppString.data(), cppString.size()),和通过在所得 的PyObject。如果你想调用任意函数,你必须使用 使用PyImport_Import加载模块,然后PyObject_GetAttrString 获取函数(Python函数是属性,就像 其他所有内容),然后使用PyObject_CallObject来调用它, 在已经转换的所有参数,并把它们在一个元组(Python的C API在所有经由 函数)。

相关问题