python - 尝试使用 boost/Python 相对导入超出顶级包
问题描述
我已经尝试了多种方法在此处的帖子中导入模块,但我决定发布一个新问题,因为该帖子是关于 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 的方法,因此我使用了绝对路径(灵感来自对此处帖子的回答):
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 上的路径应该是“/home/username/projectfiles/project/utilities/foo.py”。您缺少第一个 /。
推荐阅读
- javascript - 如何绑定参数,将函数分配给类原型
- c - 检查给定的自然数是否具有从头到尾读取的属性
- vbscript - Unicode 作为参数
- html - 当我将一些图像与 CSS 并排对齐时,一个图像的水平位置不相等。如何解决这个问题呢?请
- go - 方法保存在gorm中
- python - 如何在熊猫中将两行组合成单行
- python - 使用 Python 打开 Microsoft 商店应用程序
- vue.js - VueJS - 如何将数据传递给新的 Vue 实例
- javascript - 信用卡验证 - 带有空格的匹配模式
- css - Swiper js 不会自动调整 swiper-container 和 swiper-slide 类的大小