2012-04-28 103 views
1

正如我所理解的C和C++之間的關係,後者基本上是前者的擴展,並保留了一定程度的向後兼容性。假設可以用C++代碼調用python C API是否安全?Python C API與C++完全兼容嗎?

更重要的是,我注意到,Python官方文檔捆綁C和C++的擴展一起在同一頁上。我找不到C++ API。這使我相信相同的API在兩種語言中都是安全的。

有人可以確認或否認這一點?

編輯:

我覺得我比它必須是我的問題要複雜得多。問題是:爲了在C++中編寫python模塊,我必須做些什麼?我是否只按照列出的here的相同方向,用C代碼代替C++?是否有單獨的API?

+0

你應該能夠從C調用Python的C API ++但是你不能寫一個PythonÇ模塊在C++中。 – 2012-04-28 22:33:59

+0

@DanD。我現在有點困惑,如果你看看這個頁面,http://docs.python.org/extending/extending.html,它涉及到用C或C++擴展python。我原來的問題可能有點複雜,所以請允許我重述一下。如果我想用C++編寫一個python模塊,我需要做什麼不同於該頁面上的內容(除了使用C++構造)?你的迴應似乎表明這是不可能的,因此我的困惑。 – blz 2012-04-28 22:37:44

+0

@DanD。請注意詳細說明原因?當然,任何導出到Python的名稱都必須位於'extern「C {}塊中,因爲名稱會變形(當然,這不能導出C無法處理的東西,比如重載),但我不是意識到任何其他路障。 – delnan 2012-04-28 22:38:16

回答

4

我可以證實,相同的Python C API是安全的兩種語言,C和C++使用。 但是,除非您提出更具體的問題,否則很難爲您提供更詳細的答案。有許多警告和問題你應該知道。例如,你的Python擴展定義爲C型結構,而不是C++,所以不要指望有自己的構造函數/析構函數隱含定義和稱爲

例如,以從Defining New Types示例代碼在Python手冊,它可以被用C++編寫的方式甚至可以混合式C++類型:

// noddy.cpp 
namespace { 

struct noddy_NoddyObject 
{ 
    PyObject_HEAD 
    // Type-specific fields go here. 
    std::shared_ptr<int> value; // WARNING 
}; 

PyObject* Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 
{ 
    try { 
     Noddy *self = (Noddy *)type->tp_alloc(type, 0); 
     if (self) { 
      self->value = std::make_shared(7); 
      // or more complex operations that may throw 
      // or extract complex initialisation as Noddy_init function 
      return self; 
     } 
    } 
    catch (...) { 
     // do something, log, etc. 
    } 
    return 0; 
} 

PyTypeObject noddy_NoddyType = 
{ 
    PyObject_HEAD_INIT(NULL) 
    // ... 
} 

} // unnamed namespace 

但是,既沒有構造的也不析構std::shared_ptr將被調用。 所以,請記住定義dealloc功能爲您noddy_NoddyType在那裏你會在valuenullptr復位。爲什麼即使打擾到定義爲shared_ptr的值,您可能會問。如果您在C++中使用Python擴展(例外),以避免類型轉換和強制轉換,在實現的定義內實現更多無縫集成,基於異常的錯誤處理可能更容易,那麼這很有用,等等。 儘管由於dealloc功能value將根據衆所周知的RAII規則發佈,因此noddy_NoddyType的對象由純C中的設備管理。

在這裏,你可以找到幾乎無縫集成的Python C API與C++語言的有趣的例子:How To catch Python stdout in c++ code

+0

首先,非常感謝您的詳細解答。我完全不知道這些警告!只是一個簡單的問題:使用'boost.Python'可以避免一些這些問題嗎?我被告知這個庫比Python.h更適合C++開發。 – blz 2012-04-28 22:55:55

+0

不客氣。是的,當然Boost.Python會爲你處理幾乎所有這些問題。我的例子是基於普通的Python C API,但Boost.Python在Python C API之上提供了C++抽象,所以你可以忘記大部分問題。 – mloskot 2012-04-28 22:58:21

+1

完美,我會開始尋找提升,然後。再次感謝 - 像你這樣有用的答案是讓我回到SO! – blz 2012-04-28 23:00:42

1

的Python C API可以在C++代碼調用。 Python的C++擴展使用相同的C API爲C擴展使用,或使用一些第三方API,如boost::python寫入。

+0

輝煌,謝謝!我很快就會接受你的答案。在C++中進行編碼時,我必須做不同的事情嗎? – blz 2012-04-28 22:43:32