【问题标题】:Boost::Python Extract -- Accessing Python string in C++Boost::Python Extract -- 在 C++ 中访问 Python 字符串
【发布时间】:2016-05-09 23:07:17
【问题描述】:

我正在尝试使用 Boost Python 从 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()

【问题讨论】:

    标签: python c++ boost boost-python


    【解决方案1】:

    您可能希望调用函数并以字符串形式获取返回值,而不是尝试将函数本身转换为字符串。

    因此,您可能希望使用:

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

    代替:

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

    这是一个通用示例。在hello.py

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

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

    编译,然后运行程序:

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

    【讨论】:

    • 你完全正确。使用代码提取名为test_hello 的函数,而不是提取我正在寻找的字符串变量return_address。我的部分工作是在没有函数get_info()main() 的情况下运行Python 代码,这当然不理想,但允许我通过更改为boost::python::object test_hello = global["return_address"]; 来获取值return_address,然后提取.
    猜你喜欢
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多