【问题标题】:Why relative import so restrict?为什么相对进口如此受限制?
【发布时间】:2018-05-03 16:56:49
【问题描述】:

有目录:

app/
    sub1/
        __init__.py
        module1.py
    sub2/
        __init__.py
        test.py

我想象导入一个模块要做的是:

  1. 创建一个作用域(或线程?)

  2. 在该范围内运行 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。 (我猜)

由于参数globalslocals 都是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


【解决方案1】:

相对导入不是目录遍历机制。 from ..a import b 并不是“上一个目录,进入a 目录,加载b.py”。它的意思是“导入当前包的父包a子模块的b成员”。这通常看起来很像目录遍历所做的,但并不相同,尤其是对于涉及命名空间包、自定义模块加载器或sys.modules 操作的情况。

sub2 没有父包。试图引用一个不存在的父包是一个错误。另外,如果你直接通过文件名运行test.pysub2 甚至根本不被视为一个包。

【讨论】:

  • tysm,我会试着弄清楚那些“命名空间包,自定义模块加载器......”是什么。
猜你喜欢
  • 1970-01-01
  • 2019-01-21
  • 2015-05-23
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多