模块导入时的 boost.python 代码

发布于 2024-10-19 15:31:44 字数 101 浏览 1 评论 0原文

当我的 C++ 库导入到 Python 中时,我需要调用 InitGoogleLogging() 。我的 C++ 库使用 Boost.Python。

导入库后如何调用函数?

I need to call InitGoogleLogging() when my C++ library is imported in Python. My C++ library uses Boost.Python.

How do I call functions when the library is imported?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

反目相谮 2024-10-26 15:31:44

python 中没有真正的“定义”。当您导入时,您放入 .py 模块中的任何代码都会执行。大多数情况下,放入包文件中的代码都是“定义”代码,例如 classdef。实际上,该代码仍然会被执行,它只是创建类和函数定义作为结果。从模块中的根命名空间(缩进)调用函数将导致该函数在模块加载后立即被调用。

只需将它们放入 __init__.py 中即可。请参阅 http://www.boost.org/doc/libs/1_45_0/libs/python/doc/tutorial/doc/html/python/techniques.html#python.extending_wrapped_objects_in_python 其中讨论了使用别名,然后在 init.py 中扁平化你的命名空间。

即(这将是名为 foo 的子目录中的 __init__.py):

from _foo import *

InitGoogleLogging()

另一种选择是直接从 C++ 包装器模块调用它:

BOOST_PYTHON_MODULE(foo)
{
    InitGoogleLogging();

    class_<Foo>("Foo")
        .def("bar", &bar)
    ;
}

There are no real "definitions" in python. Any code you put in a .py module is executed when you import it. It just happens to be that most of the time the code put in the package files is the "definiton" code like class or def. In practice, that code still gets executed, it just creates your class and function definitions as a result. Calling a function from the root namespace (indentation) in the module will cause it to get called as soon as the module is loaded.

Just put them into the __init__.py. See http://www.boost.org/doc/libs/1_45_0/libs/python/doc/tutorial/doc/html/python/techniques.html#python.extending_wrapped_objects_in_python where it talks about exporting your package with an alias and then flatning your namespace in init.py.

i.e. (this would be __init__.py in a a subdirectory named foo):

from _foo import *

InitGoogleLogging()

Another alternative is calling it directly from the C++ wrapper module:

BOOST_PYTHON_MODULE(foo)
{
    InitGoogleLogging();

    class_<Foo>("Foo")
        .def("bar", &bar)
    ;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文