首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从python文件内部导入Boost.Python

如何从python文件内部导入Boost.Python
EN

Stack Overflow用户
提问于 2012-02-15 06:49:14
回答 1查看 5.2K关注 0票数 8

我正在使用Boost.Python在我的C++可执行文件中嵌入一个解释器,并执行一些预写的脚本。我已经让它工作了,所以我可以在python文件中调用函数,但是我想使用的python代码导入外部文件,这些导入失败,因为‘没有命名的模块’。但是,如果我直接从python运行该脚本,一切都会按预期运行。

所以我的问题是,在通过C++绑定运行的python脚本中导入模块的正确方法是什么?

C++代码:

#include "boost/python.hpp"

int main(int argc, char** argv)
{
  try
  {
    Py_Initialize();
    boost::python::object test = boost::python::import("__main__");
    boost::python::object testDict = test.attr("__dict__");
    boost::python::exec_file("test.py", testDict, testDict);

  }
  catch(boost::python::error_already_set& e)
  {
    PyErr_Print();
  }
return 0;

}

Python代码:

import ModuleX
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-15 13:34:58

因此,我的问题只是一个简单的例子,模块搜索路径在从C++中初始化时没有被正确设置。

From the Python Documentation intro:

在大多数系统上(特别是在Unix和Windows上,尽管细节略有不同),Py_Initialize()根据对标准Python解释器可执行文件位置的最佳猜测来计算模块搜索路径,假设Python库是在相对于Python解释器可执行文件的固定位置找到的。特别地,它相对于父目录查找名为lib/pythonX.Y的目录,其中在shell命令搜索路径(环境变量PATH)中找到名为python的可执行文件。

因此,这意味着模块搜索路径绝不会设置为指向当前工作目录,而是指向系统python安装文件夹。

我的解决方案是将模块搜索路径正确设置为指向当前工作目录。为此,您需要初始化python,然后提取sys.path值并添加任何其他路径。如果您对此不感兴趣,请原谅使用boost;您应该能够很容易地了解如何替换所需的任何字符串。

Py_Initialize();

// now time to insert the current working directory into the python path so module search can take advantage
// this must happen after python has been initialised
boost::filesystem::path workingDir = boost::filesystem::absolute("./").normalize();
PyObject* sysPath = PySys_GetObject("path");
PyList_Insert( sysPath, 0, PyString_FromString(workingDir.string().c_str()));
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9285384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档