2011-10-27 111 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在所有經由 函數)。

相關問題