使用目录:
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())
通过在特定范围内执行此脚本并进一步命名该范围。
类会提供一个范围,同样调用类变量类似于调用模块变量。
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
。 (我猜)
由于参数globals
和locals
都是类locals()
的{{1}},所以它就像我想象的导入一样。
如果这个工作正常,模块下的模块可以写为嵌套类我猜。
这种奇怪的导入会导致什么样的问题?
如果没有,为什么文件可读但不可导入(有顶级限制)?
修改
@ user2357112抱歉,我不知道怎么写多行注释:
这会给出你要求加载父包的行为吗?
Module
答案 0 :(得分:0)
相对导入不是目录遍历机制。 from ..a import b
并不意味着“上一个目录,进入a
目录,然后加载b.py
”。这意味着“导入当前包的父包的b
子模块的a
成员”。这通常看起来很像目录遍历会做什么,但它不一样,特别是对于涉及命名空间包,自定义模块加载器或sys.modules
操作的情况。
sub2
没有父包。试图引用不存在的父包是一个错误。此外,如果您直接按文件名运行test.py
,则sub2
甚至不会被视为包。