12

我正在使用 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 导入功能并从嵌入式代码中进行导入时,它会给出错误。我尝试使用 try: except: block 但这也不起作用。这是因为 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

谁能想到任何理由?

4

3 回答 3

5

如果你还没有,你需要

导入系统
sys.path.append("/home/user/whatever")

几年前嵌入 boost::python (Python v2.5) 时,这解决了我的问题。

编辑:

在旧代码中翻来覆去。也许这可以解决问题:

Py_SetProgramName(argv[0]);
Py_InitializeEx(0);

听起来不确定你是否真的需要Py_SetProgramName(),但我隐约记得那里有一些可疑的事情。

于 2009-06-02T06:38:06.587 回答
5

这没有帮助,但我找到了一个不同的解决方案来解决我的问题。我当前的代码如下所示:

#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();
        }
}

无论如何,感谢乔纳斯的回答

于 2009-06-11T18:04:14.537 回答
1

我遇到了与您相同的问题,即导致 TypeError 的一个非常简单的示例,并在这个问题中找到了答案,即提供两次命名空间,作为全局和本地。

于 2009-07-03T18:38:27.743 回答