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
我设想导入模块要做的是:

  • 创建范围(或线程?)

  • 在该范围内运行module.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中,我将尝试找出那些“命名空间包、自定义模块加载程序…”是什么。