如何通过 Boost.Python 从 python 文件导入函数
How to import a function from python file by Boost.Python
我对 boost.python 完全陌生。
看了很多推荐用boost.python申请python,但是还是不太好理解,找到适合我的解决方案。
我想要的是直接从 python "SourceFile"
导入函数或 class
示例文件:
Main.cpp
MyPythonClass.py
假设在"MyPythonClass.py"中有一个"Dog"class和"bark()"函数,我如何在cpp中获取回调和发送参数?
我不知道该怎么办!
请帮助我!
Boost python 用于从 python 源调用 cplusplus 函数。与 Perl xs 模块非常相似。
如果你在 main.cpp 中有一个函数 say bark(),你可以使用 boost python 将这个 main.cpp 转换成一个 python 可调用模块。
然后从 python 脚本(假设 link 输出文件是 main.so):
import main
main.bark()
当需要从 C++ 调用 Python,并且 C++ 拥有 main 函数时,则必须 在 C++ 程序中嵌入 Python 中断器. Boost.Python API 并不是 Python/C API 的完整包装器,因此可能会发现需要直接调用 Python/C [=52= 的一部分].然而,Boost.Python 的 API 可以使互操作性更容易。考虑阅读官方 Boost.Python embedding tutorial 了解更多信息。
这是嵌入 Python:
的 C++ 程序的基本框架
int main()
{
// Initialize Python.
Py_Initialize();
namespace python = boost::python;
try
{
... Boost.Python calls ...
}
catch (const python::error_already_set&)
{
PyErr_Print();
return 1;
}
// Do not call Py_Finalize() with Boost.Python.
}
嵌入 Python 时,可能需要扩充 module search path via PYTHONPATH
以便可以从自定义位置导入模块。
// Allow Python to load modules from the current directory.
setenv("PYTHONPATH", ".", 1);
// Initialize Python.
Py_Initialize();
通常,Boost.Python API 提供了一种以 Python-ish 方式编写 C++ 代码的方法。下面的示例 demonstrates 在 C++ 中嵌入一个 Python 解释器,并让 C++ 从磁盘导入一个 MyPythonClass
Python 模块,实例化 MyPythonClass.Dog
的一个实例,然后在 Dog
实例上调用 bark()
:
#include <boost/python.hpp>
#include <cstdlib> // setenv
int main()
{
// Allow Python to load modules from the current directory.
setenv("PYTHONPATH", ".", 1);
// Initialize Python.
Py_Initialize();
namespace python = boost::python;
try
{
// >>> import MyPythonClass
python::object my_python_class_module = python::import("MyPythonClass");
// >>> dog = MyPythonClass.Dog()
python::object dog = my_python_class_module.attr("Dog")();
// >>> dog.bark("woof");
dog.attr("bark")("woof");
}
catch (const python::error_already_set&)
{
PyErr_Print();
return 1;
}
// Do not call Py_Finalize() with Boost.Python.
}
给定一个 MyPythonClass
模块,其中包含:
class Dog():
def bark(self, message):
print "The dog barks: {}".format(message)
以上程序输出:
The dog barks: woof
我对 boost.python 完全陌生。 看了很多推荐用boost.python申请python,但是还是不太好理解,找到适合我的解决方案。
我想要的是直接从 python "SourceFile"
导入函数或 class示例文件: Main.cpp MyPythonClass.py
假设在"MyPythonClass.py"中有一个"Dog"class和"bark()"函数,我如何在cpp中获取回调和发送参数?
我不知道该怎么办! 请帮助我!
Boost python 用于从 python 源调用 cplusplus 函数。与 Perl xs 模块非常相似。
如果你在 main.cpp 中有一个函数 say bark(),你可以使用 boost python 将这个 main.cpp 转换成一个 python 可调用模块。
然后从 python 脚本(假设 link 输出文件是 main.so):
import main
main.bark()
当需要从 C++ 调用 Python,并且 C++ 拥有 main 函数时,则必须 在 C++ 程序中嵌入 Python 中断器. Boost.Python API 并不是 Python/C API 的完整包装器,因此可能会发现需要直接调用 Python/C [=52= 的一部分].然而,Boost.Python 的 API 可以使互操作性更容易。考虑阅读官方 Boost.Python embedding tutorial 了解更多信息。
这是嵌入 Python:
的 C++ 程序的基本框架int main()
{
// Initialize Python.
Py_Initialize();
namespace python = boost::python;
try
{
... Boost.Python calls ...
}
catch (const python::error_already_set&)
{
PyErr_Print();
return 1;
}
// Do not call Py_Finalize() with Boost.Python.
}
嵌入 Python 时,可能需要扩充 module search path via PYTHONPATH
以便可以从自定义位置导入模块。
// Allow Python to load modules from the current directory.
setenv("PYTHONPATH", ".", 1);
// Initialize Python.
Py_Initialize();
通常,Boost.Python API 提供了一种以 Python-ish 方式编写 C++ 代码的方法。下面的示例 demonstrates 在 C++ 中嵌入一个 Python 解释器,并让 C++ 从磁盘导入一个 MyPythonClass
Python 模块,实例化 MyPythonClass.Dog
的一个实例,然后在 Dog
实例上调用 bark()
:
#include <boost/python.hpp>
#include <cstdlib> // setenv
int main()
{
// Allow Python to load modules from the current directory.
setenv("PYTHONPATH", ".", 1);
// Initialize Python.
Py_Initialize();
namespace python = boost::python;
try
{
// >>> import MyPythonClass
python::object my_python_class_module = python::import("MyPythonClass");
// >>> dog = MyPythonClass.Dog()
python::object dog = my_python_class_module.attr("Dog")();
// >>> dog.bark("woof");
dog.attr("bark")("woof");
}
catch (const python::error_already_set&)
{
PyErr_Print();
return 1;
}
// Do not call Py_Finalize() with Boost.Python.
}
给定一个 MyPythonClass
模块,其中包含:
class Dog():
def bark(self, message):
print "The dog barks: {}".format(message)
以上程序输出:
The dog barks: woof