尝试使用 boost/Python 相对导入超出***包

Posted

技术标签:

【中文标题】尝试使用 boost/Python 相对导入超出***包【英文标题】:attempted relative import beyond top-level package with boost/Python 【发布时间】:2020-07-23 17:47:14 【问题描述】:

我尝试了多种方法在帖子here 中导入模块,但我决定发布一个新问题,因为该帖子是关于 boost 无法找到该模块。这是文件夹的结构:

project
   |__ utilities
   |      |__ foo.py
   |
   |__ boost_extensions
   |      |__ myclass.cpp
   |      |__ myclass.so
   |
   |__ someotherstuff
   |      |__ bar.py      
   |
   |__ mylib.py
   |
   |__ __main__.py

在 foo.py 中,我有一些从 mylib.py 导入的代码:

from ..mylib import MyLib
class Foo:
    # code

在 myclass.cpp 中,我找不到使用相对路径导入 Foo 的方法,所以我使用了绝对路径(灵感来自对帖子 here 的回答):

boost::python::object mod;
void set_global()
    boost::python::object importlib_util = import("importlib.util");

    boost::python::object spec = \
        importlib_util.attr("spec_from_file_location")("module.name",\
            "/home/username/projectfiles/project/utilities/foo.py");

    boost::python::object foo = importlib_util.attr("module_from_spec")(spec);
    mod = spec.attr("loader").attr("exec_module")(foo);

这给了我一个错误:

    from ..mylib import MyLib
ValueError: attempted relative import beyond top-level package

我该如何解决这个问题?

谢谢

编辑:不确定这是否相关,但如果我打印变量__name__,无论我在代码中输入什么,它总是module.name

# with ..utilities.foo instead of module.name in the function 
# importlib_util.attr("spec_from_file_location")("module.name",\
#            "home/username/projectfiles/project/utilities/foo.py");
print(__name__)
from ..mylib import MyLib
#output : module.name

【问题讨论】:

您使用的是 Linux 而不是 Windows? 是的,我在 linux (fedora) 上。 【参考方案1】:

您在 Linux 上的路径应该是“/home/username/projectfiles/project/utilities/foo.py”。您缺少第一个 /。

【讨论】:

我的错,我想我在写这篇文章时不小心删除了 / ......我确实有第一个 / 但它仍然给出了同样的错误【参考方案2】:

我发布了一个类似的问题,solution for that 也在这里工作(它是关于尝试通过使用相对路径在 C++ 中导入一个 python 模块,我发表了一篇关于它的不同帖子,因为它给出了一个完全不同的错误)。基本上我在 python 中加载了模块并将其作为参数传递给 C++。

【讨论】:

以上是关于尝试使用 boost/Python 相对导入超出***包的主要内容,如果未能解决你的问题,请参考以下文章

尝试相对导入超出***包 python

ValueError:尝试相对导入超出***包

Boost.Python 创建的 dll 无法导入(遵循 Boost Python 的 QuickStart)

使用boost python嵌入python时导入错误

如何在 boost::python 嵌入式 python 代码中导入模块?

从boost python模块中的pyside导入类?