2016-08-04 17 views
3

verwende ich Boost 1.57 und Boost Python. Hier ist mein Codebeispiel:Boost Python-Liste erhalten Element verursacht Fehler, wenn ich Operator []

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 

In dieser Liste habe ich einige Tupel enthaltenen Strings aus Python gespeichert. Es scheint, dass Datensätze [i] außerhalb dieses Bereichs Py_DECREF aufrufen und einen Fehler verursachen. Wie sollte ich also Daten von einem Artikel erhalten?

+0

Was ist 'Datensätze [i];' tun soll? Was ist 'liste'? Ich nehme keine 'std :: list' an, da diese keinen wahlfreien Zugriff hat. Was ist der Fehler? – doctorlove

+0

'list' ist die boost :: python :: list. Zuerst habe ich 'boost :: python :: call_method >> (...)' verwendet, um das Ergebnis zu erhalten, aber den Programmabsturz zu verursachen. Dann fand ich, dass es 'boost :: python :: list' verwenden sollte, um das Ergebnis zu behalten. Aber auch wenn ich 'boost :: python :: object obj = records [i]' schreibe, stürzt auf 'Py_DECREF' in' ~ object_base() 'ab, wenn der loop scope ausgeht. Also, wie soll ich das richtig machen? – webberg

Antwort

0

Es scheint, dass einige Betreiber [] kann diese Phänomen verursachen, so habe ich es und Gebrauch folgende Lösung zu vermeiden:

#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); 
      ... 
     }