2016-05-09 17 views
0

Boost Pythonを使用してC++でPython関数から返された文字列値にアクセスしようとしています。Boost :: Python Extract - C++でのPython文字列へのアクセス

私はこのエラーを見ている:

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 

エラーが理にかなって、Pythonのデータ型は、C++のデータ型に一致していません。しかし、私はそれを修正する方法がわかりません。

C++のコードは次のとおりです。

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; 

ザ・Pythonのコードは次のとおりです。

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() 

答えて

1

あなたはおそらく、関数を呼び出すと、文字列として戻り値を取得するのではなく、変換しようとしたいですそれ自身を文字列に変換します。このように

、使用したいことがあります。

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

の代わりに:

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

ここでは一般化した例です。 hello.pyで:

example.cc
def hello_from_python(): 
    return 'Hello from Python!' 

:あなたは完全に正しかった

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

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

コンパイルし、プログラムを実行します。このコードでは、 'return_address'だった文字列変数を抽出するのではなく、' test_hello'という関数を抽出していました。このために私の仕事の一部は、 'get_info()'と 'main()'関数を使わずにPythonコードを実行することでしたが、これは理想的ではありませんが、 'return_address'を' boost :: python :: object test_hello = global ["return_address"]; '、次に展開します。 – TMC