2016-08-04 3 views
3

私はboost 1.57を使用してPythonを強化します。ここに私のコードの例です。このリストにboost python list演算子[]を使用するとエラーが発生する項目を取得します

list records = call_method<list>(...); 
object attr = records.attr("__len__")(); 
int n = extract<long>(attr); 
for (int i = 0; i < n; ++i) 
{ 
    records[i]; 
}//here cause error 

私はいくつかのタプルのpythonからの文字列が含まれて保存されています。この範囲外のレコード[i]はPy_DECREFを呼び出し、エラーを引き起こすようです。それで、アイテムからデータを取得するにはどうすればよいですか?

+0

'レコードの[i]はどのようなものです;'行うことになって? 'list'とは何ですか?私は 'std :: list'を想定していません。ランダムアクセスがないからです。エラーは何ですか? – doctorlove

+0

'list'はboost :: python :: listです。まず、boost :: python :: call_method >>(...) 'を使用して結果を得るが、プログラムがクラッシュする。それから、結果を保持するために 'boost :: python :: list'を使うべきであることがわかりました。しかし、 'boost :: python :: object obj = records [i]'を '〜object_base()'の 'Py_DECREF'にクラッシュさせるとループスコープを使い果たしてしまいます。だから私は正しくする必要がありますか? – webberg

答えて

0

いくつかのオペレータは[]これらの現象を引き起こす可能性があることと思われるので、私はそれを避けるために、以下のソリューションを使用する必要があります。

#include <boost/python/stl_iterator.hpp> 

     list records = call_method<list>(...); 
     stl_input_iterator<tuple> end; 
     for (stl_input_iterator<tuple> itr(records); itr != end;++itr) 
     { 
      auto record = *itr; 
      std::string tick = call_method<std::string>(record.ptr(), "__getitem__", 0); 
      ... 
     } 
関連する問題