python - 为什么相对进口如此受限制?
问题描述
带目录:
app/
sub1/
__init__.py
module1.py
sub2/
__init__.py
test.py
我想象导入一个模块要做的是:
创建一个范围(或线程?)
在该范围内运行 module.py
from ..sub import module1
在顶层无效test.py
但open('../sub1/module1.py', 'r')
有效!
所以它是可读的,但不可导入。
从类似的东西开始import moudule as *
exec(open('../sub1/module1.py', 'r').read())
通过在特定范围内执行此脚本并命名该范围来做进一步的事情。
class 将提供一个范围,调用类变量也类似于调用模块变量。
import module1 as cus
class Module:
exec(open('../sub1/module1.py', 'r').read(), locals(), locals())
cus = Mudule()
cus.function_inside_module1()
函数在作用域下exec(object[, globals[, locals]])
运行,并将变量存储到. (我猜)object
globals
locals
由于 argumentglobals
和locals
都是locals()
class Module
,这就像我想象的 import 要做的。
如果这个工作正常,我猜模块下的模块可以写成嵌套类。
这种奇怪的导入会导致什么样的问题?
如果不是,为什么文件可读但不可导入(有顶级限制)?
编辑
@user2357112 抱歉,我不知道如何写多行注释:
这会给出您要求加载父包的行为吗?
class sub1:
exec(open('../sub1/__init__.py', 'r').read(), locals(), locals())
class Module:
exec(open('../sub1/module1.py', 'r').read(), locals(), locals())
cus = sub1.Module()
del sub1
解决方案
相对导入不是目录遍历机制。from ..a import b
并不意味着“上一个目录,进入a
目录,然后加载b.py
”。意思是“导入当前包的父包b
的子模块的成员”。这通常看起来很像目录遍历所做的事情,但并不相同,尤其是对于涉及命名空间包、自定义模块加载器或操作的情况。a
sys.modules
sub2
没有父包。试图引用一个不存在的父包是一个错误。此外,如果您test.py
直接按文件名运行,sub2
则根本不被视为包。
推荐阅读
- ios - 当点击导航按钮太快时反应原生崩溃
- javascript - 使用 javascript 检查来自 forEach 响应的所有条件的更有效方法
- ios - 如何在 React Native 中显示数学公式?
- python-3.x - 如何向 argparse 输入特定参数?
- python-3.x - 在基于事件的微服务之前实现 RESTful API
- java - E/RecyclerView 出错:未连接适配器;跳过布局
- java - 为什么这个解决方案是反向整数(Leet Code)O((log10(n))?
- java - 如何在百里香中迭代输入值
- python - 标签上的 Tkinter 标签
- apache-kafka - 如何在 Kafka 和 Flink 环境中测试性能?