我可以證實,相同的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
在那裏你會在value
與nullptr
復位。爲什麼即使打擾到定義爲shared_ptr
的值,您可能會問。如果您在C++中使用Python擴展(例外),以避免類型轉換和強制轉換,在實現的定義內實現更多無縫集成,基於異常的錯誤處理可能更容易,那麼這很有用,等等。 儘管由於dealloc
功能value
將根據衆所周知的RAII規則發佈,因此noddy_NoddyType
的對象由純C中的設備管理。
在這裏,你可以找到幾乎無縫集成的Python C API與C++語言的有趣的例子:How To catch Python stdout in c++ code
你應該能夠從C調用Python的C API ++但是你不能寫一個PythonÇ模塊在C++中。 – 2012-04-28 22:33:59
@DanD。我現在有點困惑,如果你看看這個頁面,http://docs.python.org/extending/extending.html,它涉及到用C或C++擴展python。我原來的問題可能有點複雜,所以請允許我重述一下。如果我想用C++編寫一個python模塊,我需要做什麼不同於該頁面上的內容(除了使用C++構造)?你的迴應似乎表明這是不可能的,因此我的困惑。 – blz 2012-04-28 22:37:44
@DanD。請注意詳細說明原因?當然,任何導出到Python的名稱都必須位於'extern「C {}塊中,因爲名稱會變形(當然,這不能導出C無法處理的東西,比如重載),但我不是意識到任何其他路障。 – delnan 2012-04-28 22:38:16