book.pythonを利用してpythonを拡張します。

5210 ワード

先日、boots.pythonを利用してC++関数をカプセル化してPythonに呼び出させると書きました。今日はboots.pythonパッケージC++の種類を勉強して、Pythonのために使います。そのため、また資料を調べました。
話が簡潔であるhttp://blog.sina.com.cn/s/blog_71 cc 5 f 211018 jkp.
公式文書:
http://write.blog.csdn.net/postedit?ref=toolbar&ticket=ST-152285-gnBGvONCmDqgLMwN 7 cko-passport.csdn.net
英語があまり上手ではないなら、この中国語を参考にしてもいいです。公式文書と同じです。
http://hwcrazy.com/922cfce470b611e196c2000d601c5586/97ce183670b611e196c2000d601c5586/
簡単な例:
http://www.2cto.com/kf/201507/415354.html
Boost.Pythonを通じて、Python内でC+クラスと関数を使用できます。SWIGと同じBoost.Python拡張コードを作成することを簡略化し、Python/C APIを使用しない。しかし、SWIGと違って、Boost.Pythonはクラスライブラリであり、インタフェースファイルを再利用する必要はない。
1.初期化と方法リストは、Boost.PythonでBOOST_を使用することができます。PYTHON_MODULEはモジュール名を命名します。BOOSTにいますPYTHON_MODULEでは、Python/C APIを使用して定義された方法のリストが、defを使用して実装されてもよい。以下は簡単な例です。
    
void show()      //   show  
{
cout << 'Boost.Python';
}
BOOST_PYTHON_MODULE(example)  //   BOOST_PYTHON_MODULE      “example”
{
def('show',show);   //          
}
2.導出クラスは、Boost.Pythonにより、C++で定義されたクラスとその方法、属性などをPythonに導入することができます。以下のプログラムはC++の中でMessageクラスを定義してから、BOOST(u)を通じてPYTHON_MODULEはPythonに導入します。
    
#include 
#include 
#include 
using namespace boost::python;
#pragma comment(lib, 'boost_python.lib')
class Message
{
public:
std::string msg;
Message(std::string m)
{
msg = m;
} 
void set(std::string m) 
{ 
msg = m;
}
std::string get()
{ 
return msg; 
}

};
BOOST_PYTHON_MODULE(Message)
{
class_('Message', init())
.def('set', &Message::set)
.def('get', &Message::get)
;
}
以下のコードはPythonでコンパイルされたMessageモジュールを使用します。
    
>>> import Message
>>> c = Message.Message('hi')
>>> c.get()
'hi'
>>> c.set('Boost.Python')
>>> c.get()
'Boost.Python'
3.クラスのメンバー属性C++のクラスのメンバーは、キーワード宣言を異なる属性として使用することができます。Pythonではクラス属性のネーミングに依存します。Boost.Pythonを使用して、そのC++のクラスのメンバーの属性をPythonに渡すことができます。以下のコードは、Boost.Pythonを使用してクラスメンバーの属性を処理します。BOOST_をPYTHON_MODULEのコードは以下のように変更されます。
    
BOOST_PYTHON_MODULE(Message)
{
class_('Message', init())
.def('set', &Message::set)
.def('get', &Message::get)
.def_readwrite('msg', &Message::msg);
;
}
ここではMessageクラスのメンバーmsgを読み書き可能に設定し、「.def_」を使用することもできます。リードオンリー属性に設定します。クラスのプライベートメンバーに対しては、「.add_」も使用できます。propertyは、その操作関数をPythonクラスの属性に設定します。下記のコードは「.add_」を使用します。プライベートメンバーを操作する。
    
BOOST_PYTHON_MODULE(Message)
{
class_('Message',init())
.add_property('msg',&Message::get,&Message::set);
}
以下のコードはPythonでコンパイルされたMessageモジュールを使用します。
    >>> import Message
>>> s = Message.Message('hi')
>>> s.msg
'hi'
>>> s.msg = 'boot'
>>> s.msg
'boot'
4.クラスの継承C++中類の継承関係は、Boost.Pythonを通じてPythonモジュールにも反映されます。以下のコードは、親と子をそれぞれPythonモジュールに導入します。
 
    
#include 
#include 
#include 
using namespace boost::python;
#pragma comment(lib, 'boost_python.lib')
class Message
{
public:
std::string msg; 
Message(std::string m)
{
msg = m;
} 
void set(std::string m) 
{ 
msg = m;
}
std::string get()
{ 
return msg; 
}

};
class Msg:public Message
{
public:
int count;
Msg(std::string m):Message(m)
{
}
void setcount(int n)
{
count = n;
}
int getcount()
{
return count;
}
};
BOOST_PYTHON_MODULE(Message)
{
class_('Message',init())
.add_property('msg',&Message::get,&Message::set);
class_
5.演算子をPythonに重載することは、実際には特別な方法である。C++において演算子を再負荷した後、Boost.Pythonを介してPythonに渡すことができます。Msg類の「+」演算子を下記のコードで重載し、「.def」を通じてPythonに渡す。
    
class Msg:public Message
{
public:
int count;
Msg(std::string m):Message(m)
{
}
void setcount(int n)
{
count = n;
}
int getcount()
{
return count;
}
int operator+ (Msg x) const
{
int r;
r = count + x.count;
return r;
}
};
BOOST_PYTHON_MODULE(Message)
{
class_('Message',init())
.add_property('msg',&Message::get,&Message::set);
class_
他の演算子についても同様の方法が使用されます。
    
.def(self - self)            //    _sub_  
.def(self * self)   //    _mul_  
.def(self /self)    //    _div_  
.def(self < self);           //    _lt_  
6.Boost.Pythonを使ってC++にPythonを埋め込んでC++にPythonを埋め込む主な問題はC++とPythonの間のデータタイプの変換です。Boost.PythonはPython/C APIをカプセル化し、Pythonと同様にデータを声明、操作することができる。Boost.PythonではObjectクラスを使用してPython/C APIのPyObject*をカプセル化しました。Boost.Pythonは、表8-2に示すように、Pythonのリストや辞書などに対応するクラスを定義しています。
表8-2 Boost.PythonとPythonの中の部分類の対応関係
 
Boost.Python
Python
リスト
リスト
プロジェクト
字典
tuple
元のグループ
str
文字列
 
Boost.PythonはPythonにおけるオブジェクトの操作方法を提供する。例えば、str類はlower、split、title、uperなどの方法があります。list類はapped、count、extedなどの方法を持っています。以下のコードはBoost.Pythonを使用してC++にPythonを埋め込みます。