如何在 boost::python 嵌入式 python 代码中导入模块?
-
06-09-2019 - |
题
我正在使用 boost::python 将一些 python 代码嵌入到应用程序中。我能够正确评估打印语句或其他表达式,但是当我尝试导入模块时,它没有导入并且应用程序正在退出。此外,嵌入代码中的 globals() 函数调用也会产生运行时错误。
#include <boost/python.hpp>
using namespace boost;
using namespace boost::python;
using namespace boost::python::api;
int main(void) {
Py_Initialize();
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
main_namespace["urllib2"] = import("urllib2");
object ignored = exec(
"print 'time'\n", main_namespace);
}
在这里,我尝试使用 boost 导入函数导入 urllib2,这可以正确编译并运行,但使用以下 exec 语句时,会出现错误。
object ignored = exec(
"print urllib2\n"
"print 'time'\n", main_namespace);
或者,当我删除 boost 导入函数并从嵌入代码中进行导入时,它会给出错误。我尝试使用尝试:除了:阻止但这也不起作用。这是因为 C++ 应用程序无法找到 urllib2 py 模块的位置还是其他原因?有没有办法在尝试导入之前设置模块的路径?
这是仅为内部使用而构建的,因此对路径进行一些硬编码是可以接受的。
编辑:更多信息:
这就是发生的事情。我尝试了一下..当出现异常时,catch 并调用 PyErr_Print() ,并且当存在模块导入甚至函数调用时,始终将其视为错误。错误信息:
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: 'NoneType' object does not support item assignment
有人能想到什么原因吗?
解决方案 2
这是没有帮助的,但我发现了一个不同的解决我的问题。我当前的代码看起来是这样的:
#include <boost/python.hpp>
#include <iostream>
using namespace std;
using namespace boost;
using namespace boost::python;
using namespace boost::python::api;
int main(void) {
Py_Initialize();
boost::python::object http = boost::python::import("urllib2");
try
{
boost::python::object response = http.attr("urlopen")("http://www.google.com");
boost::python::object read = response.attr("read")();
std::string strResponse = boost::python::extract<string>(read);
cout << strResponse << endl;
}
catch(...)
{
PyErr_Print();
PyErr_Clear();
}
}
反正,感谢答案乔纳斯
其他提示
如果您还没有,你需要
import sys sys.path.append("/home/user/whatever")
几年前嵌入的boost ::蟒(Python的V2.5)时把我的问题护理。
编辑:
在旧代码戳周围。也许这是卓有成效的:
Py_SetProgramName(argv[0]); Py_InitializeEx(0);
声音不清楚,你应该真正需要的Py_SetProgramName()
,但我依稀记得一些可疑的商业存在。
我遇到了和你一样的问题,我是一个非常简单的例子,导致了 TypeError,并在中找到了答案 这个问题, ,这将提供两次命名空间,既作为全局命名空间,又作为本地命名空间。
不隶属于 StackOverflow