Python 为什么相对进口会受到如此严格的限制?
使用目录:Python 为什么相对进口会受到如此严格的限制?,python,python-3.x,import,module,relative-path,Python,Python 3.x,Import,Module,Relative Path,使用目录: app/ sub1/ __init__.py module1.py sub2/ __init__.py test.py 我设想导入模块要做的是: 创建范围(或线程?) 在该范围内运行module.py from..sub import module1无效,顶层位于test.py 但是open('../sub1/module1.py','r')works 所以它是可读的,但不可导入 从类似于导入模块为*
app/
sub1/
__init__.py
module1.py
sub2/
__init__.py
test.py
我设想导入模块要做的是:
from..sub import module1
无效,顶层位于test.py
但是open('../sub1/module1.py','r')
works
所以它是可读的,但不可导入
从类似于导入模块为*
exec(打开('../sub1/module1.py','r').read())
通过在sepcific作用域中执行此脚本并命名该作用域来进一步执行
类将提供一个作用域,调用类变量类似于调用模块变量
将模块1作为cus导入
类模块:
exec(打开('../sub1/module1.py',r').read(),locals(),locals())
cus=Mudule()
模块1()内的cus.function
函数exec(object[,globals[,locals]])
在globals
作用域下运行object
,并将变量存储到locals
中。(我猜)
由于参数globals
和locals
都是类Module
的locals()
若这项工作正常,我想模块下的模块可以写为嵌套类
这种奇怪的进口会造成什么样的问题
如果不是,为什么文件可读但不可导入(具有顶级限制)
编辑
@user2357112抱歉,我不知道如何编写多行注释:
这会给出您要求加载父包的行为吗
class sub1:
exec(打开('../sub1/_init__.py',r').read(),locals(),locals())
课程模块:
exec(打开('../sub1/module1.py',r').read(),locals(),locals())
cus=sub1.Module()
del sub1
相对导入不是目录遍历机制from..a导入b
并不意味着“上一个目录,输入a
目录,然后加载b.py
”。这意味着“导入当前包的父包的a
子模块的b
成员”。这通常看起来很像目录遍历所做的工作,但它并不相同,尤其是在涉及命名空间包、自定义模块加载程序或sys.modules
操作的情况下
sub2
没有父包。尝试引用不存在的父包是错误的。另外,如果您直接按文件名运行test.py
,sub2
甚至根本不被视为包。相对导入不是目录遍历机制。您如何运行该程序?是不是python3测试.py
?你在哪个目录下?@user2357112-我不明白。对于基于文件的模块,这是一种目录遍历。@tdelaney是的,在test.pytysm中,我将尝试找出那些“命名空间包、自定义模块加载程序…”是什么。