Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Python文件内部导入Boost.Python 我使用Booost .python在我的C++可执行文件中嵌入解释器,并执行一些预编写脚本。我已经让它工作了,这样我可以调用python文件中的函数,但是我想要使用的python代码导入了外部文件,这些导入失败,因为“没有命名的模块”。但是,如果我直接从python运行脚本,那么一切都会按预期工作 所以我的问题是,在通过C++绑定运行的Python脚本中导入模块的正确方法是什么?_Python_C++_Boost_Import_Boost Python - Fatal编程技术网

如何从Python文件内部导入Boost.Python 我使用Booost .python在我的C++可执行文件中嵌入解释器,并执行一些预编写脚本。我已经让它工作了,这样我可以调用python文件中的函数,但是我想要使用的python代码导入了外部文件,这些导入失败,因为“没有命名的模块”。但是,如果我直接从python运行脚本,那么一切都会按预期工作 所以我的问题是,在通过C++绑定运行的Python脚本中导入模块的正确方法是什么?

如何从Python文件内部导入Boost.Python 我使用Booost .python在我的C++可执行文件中嵌入解释器,并执行一些预编写脚本。我已经让它工作了,这样我可以调用python文件中的函数,但是我想要使用的python代码导入了外部文件,这些导入失败,因为“没有命名的模块”。但是,如果我直接从python运行脚本,那么一切都会按预期工作 所以我的问题是,在通过C++绑定运行的Python脚本中导入模块的正确方法是什么?,python,c++,boost,import,boost-python,Python,C++,Boost,Import,Boost 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::ex

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

<> p>因此,我的问题是,当从C++内部初始化时,模块搜索路径没有正确设置。

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

因此,这意味着模块搜索路径并没有设置为指向当前工作目录,而是指向system 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()));

对于Python3,将
PyString\u FromString
替换为
PyBytes\u FromString
@tammojan注释:对于Python3,将
PyString\u FromString
替换为
PyUnicode\u FromString