使用转换器提升 Python 问题 - 静态链接

Posted

技术标签:

【中文标题】使用转换器提升 Python 问题 - 静态链接【英文标题】:Boost Python issue with converters - static linking 【发布时间】:2020-10-14 13:09:55 【问题描述】:

我对以下代码有疑问。

这是一个如何通过 shared_ptr 将自定义类传递给嵌入式 python 代码的示例,并且当 boost 被动态链接时它可以工作。

不幸的是,带有静态链接 boost 的相同代码无法使用以下错误消息:

“未找到 C++ 类型的 to_python(按值)转换器:class boost::shared_ptr”。

我不明白为什么不同的链接会影响已注册转换器的类型识别。我错过了什么?

谁能帮帮我?

谢谢,

多米尼克

来自here 的示例。

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

namespace bp = boost::python;

struct Foo
    Foo()
    Foo(std::string const& s) : m_string(s)
    void doSomething() 
        std::cout << "Foo:" << m_string << std::endl;
    
    std::string m_string;
;

typedef boost::shared_ptr<Foo> foo_ptr;

BOOST_PYTHON_MODULE(hello)

    bp::class_<Foo, foo_ptr>("Foo")
        .def("doSomething", &Foo::doSomething)
    ;
;

int main(int argc, char **argv)

    Py_Initialize();
    try 
        PyRun_SimpleString(
            "a_foo = None\n"
            "\n"
            "def setup(a_foo_from_cxx):\n"
            "    print 'setup called with', a_foo_from_cxx\n"
            "    global a_foo\n"
            "    a_foo = a_foo_from_cxx\n"
            "\n"
            "def run():\n"
            "    a_foo.doSomething()\n"
            "\n"
            "print 'main module loaded'\n"
        );

        foo_ptr a_cxx_foo = boost::make_shared<Foo>("c++");

        inithello();
        bp::object main = bp::object(bp::handle<>(bp::borrowed(
            PyImport_AddModule("__main__")
        )));

        // pass the reference to a_cxx_foo into python:
        bp::object setup_func = main.attr("setup");
        setup_func(a_cxx_foo);

        // now run the python 'main' function
        bp::object run_func = main.attr("run");
        run_func();
    
    catch (bp::error_already_set) 
        PyErr_Print();
    

    Py_Finalize();

    return 0;

【问题讨论】:

【参考方案1】:

据我了解关于 Boost Python 链接的documentation,似乎用于将 Python 对象自动转换为 C++ 对象的转换注册表在静态链接时不可用。我面临同样的问题,很遗憾实际上是这样。我本以为至少需要捆绑所需的转换器,但恐怕由于某种原因并非如此。

【讨论】:

我设法通过将 python 包装器和解释器放在同一个项目中来使其工作。 很高兴知道!太悲伤的静态链接是如此糟糕的记录......

以上是关于使用转换器提升 Python 问题 - 静态链接的主要内容,如果未能解决你的问题,请参考以下文章

使用大量静态方法是一件坏事吗?

如何将本机 C++ 静态库链接到托管 C++ 程序集

深入理解计算机系统CSAPP Ch7:静动态库制作与神奇的库打桩机制

静态链接库asan与gcc 4.8

『Pytorch』静动态图构建对比

CMake - 链接器错误与静态yaml-cpp作为git子模块