我正在使用 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
所以事实证明我的问题是一个简单的情况,即从 C++ 中初始化时模块搜索路径设置不正确。
来自 Python 文档的介绍: http://docs.python.org/c-api/intro.html
在大多数系统上(特别是在 Unix 和 Windows 上,尽管
细节略有不同),Py_Initialize()计算模块
基于对标准位置的最佳猜测的搜索路径
Python解释器可执行文件,假设Python库是
位于相对于 Python 解释器的固定位置
可执行的。特别是,它会查找名为的目录
lib/pythonX.Y 相对于可执行文件所在的父目录
名为 python 在 shell 命令搜索路径中找到(
环境变量路径)。
所以这意味着模块搜索路径决不会设置为指向当前工作目录,而是指向系统 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()));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)