【发布时间】:2018-05-03 16:56:49
【问题描述】:
有目录:
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]])在globals作用域下运行object,并将变量存入locals。 (我猜)
由于参数globals 和locals 都是locals() 类Module,这就像我想象的导入要做的事情。
如果这个工作正常,我猜模块下的模块可以写成嵌套类。
这种奇怪的导入会导致什么样的问题?
如果不是,为什么文件可读但不可导入(有顶级限制)?
编辑
@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
【问题讨论】:
-
相对导入不是目录遍历机制。
-
你是如何运行程序的?是
python3 test.py吗?你在哪个目录? -
@user2357112 - 我不明白。对于基于文件的模块,它是一个目录遍历。
-
@tdelaney 是的,在 test.py 中
标签: python python-3.x import module relative-path