2016-05-09 9 views
0

Ich versuche, zurückgegebene Zeichenfolge Werte aus einer Python-Funktion in C++ mit Boost Python.Boost :: Python-Extrakt - Zugreifen auf Python-Zeichenfolge in C++

Ich sehe diesen Fehler:

TypeError: No registered converter was able to produce a C++ rvalue of type std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > from this Python object of type function 

Der Fehler Sinn macht, ist der Python-Datentyp der C++ Datentypen nicht übereinstimmen. Aber ich bin mir nicht sicher, wie ich das beheben soll.

Der C++ Code ist:

Py_Initialize(); 
try { 
    boost::python::object main = boost::python::import("__main__"); 

    boost::python::object global(main.attr("__dict__")); 

    boost::python::object result = exec_file("/Users/tomconlin/Documents/495_496_Research/Current_Source_Code/Source_Files/test_hello.py", global, global); 

    boost::python::object test_hello = global["get_info"]; 

    std::string message = boost::python::extract<std::string>(test_hello); 

    std::string m = message; 
    std::cout << message << std::endl; 
    return message; 
} 
catch (boost::python::error_already_set&) { 
    PyErr_Print(); 
} 

Py_Finalize(); 

std::string error_string = "\nAn Error Occured\n"; 
return error_string; 

Der Python-Code ist:

import sys 
sys.path.append("/Users/tomconlin/anaconda/lib/python2.7/site-packages") 

def get_info(): 
    version = 2 # API version 
    block_io = BlockIo('2c18-7990-8d0d-7511', '7816902248', version) 

    credit_card_balance = block_io.get_address_balance(addresses='2Mytv6K7BkiBRuHhnHmVTTc51xyhLRNtDgr') 

    #print "Credit Card Balance Type:", type(credit_card_balance) 
    address = "" 
    for key in credit_card_balance: 
     address += str(credit_card_balance[key]) 

    #print "This is the address:", address 
    address = address.split() 
    #print address 
    print "\n\n" 
    return_address = address[12].strip("u',") 
    print return_address 
    print "\n\n" 
    return return_address 

def main(): 
    get_info() 

if __name__ == '__main__': 
    from block_io import BlockIo 
    main() 

Antwort

1

Sie wollen wahrscheinlich die Funktion aufrufen und den Rückgabewert als String zu bekommen, anstatt zu versuchen, das konvertieren Funktion selbst in eine Zeichenfolge.

Als solche können Sie verwenden möchten:

boost::python::extract<std::string>(test_hello()); 

Statt:

boost::python::extract<std::string>(test_hello); 

Hier ist ein allgemeines Beispiel. In hello.py:

def hello_from_python(): 
    return 'Hello from Python!' 

In example.cc:

#include <iostream> 
#include <string> 
#include <boost/python.hpp> 

namespace py = boost::python; 

int main (int argc, char * argv []) { 
    // Initialize the Python interpreter. 
    Py_Initialize(); 

    // Add the current directory to the path. 
    py::import("sys").attr("path").attr("append")("."); 

    // Get the "hello_from_python" function from "hello.py". 
    py::object hello_from_python = py::import("hello").attr("hello_from_python"); 

    // Call the "hello_from_python" and extract the return value as a string. 
    std::string return_value = py::extract<std::string>(hello_from_python()); 

    // Print out the return value. 
    std::cout << "Return value: '" << return_value << "'" << std::endl; 
} 

Compile, dann das Programm aus:

$ ./example 
Return value: 'Hello from Python!' 
+0

Sie waren völlig richtig. Mit dem Code wurde die Funktion namens "test_hello" extrahiert, anstatt die Stringvariable zu extrahieren, die ich gesucht habe, nämlich "return_address". Ein Teil meiner Arbeit dafür bestand darin, den Python-Code ohne die Funktionen 'get_info()' und 'main()' auszuführen, was natürlich nicht ideal ist, aber mir erlaubte, den Wert 'return_address' durch' boost' zu übernehmen :: python :: object test_hello = global ["return_address"]; ', dann extrahieren. – TMC