python中相对导入的问题

问题一:使用了相对导入,但是执行时报 “ValueError: Attempted relative import in non-package”

查文档,原因是当前执行的模块不能含有相对导入。所以你需要有一个启动模块,将其导入后再执行

问题二:模块重复导入

python通过sys.modules来保存导入过的模块,但是如果在一个模块内部来运行时,有可能存在双重导入的问题。比如以下目录结构:

testdir/
    c/
        __init__.py
        b.py

__init__.py 的内容是:

x = []

如果在C目录下运行b.py,那么如果它要使用 __init__.py 中的变量(函数重复导入也无所谓),会有两种写法:

import sys
sys.path.insert(0, '..')
from c import x
print id(x)

from __init__ import x
print id(x)
  • 第一种是向sys.path插入父目录,然后通过导入模块来得到 x 变量。
  • 第二种是通过导入 init 来得到 x 变量

执行以上的代码,你会发现两个输出的id值是不同的,即 __init__.py 被重复导入了。

在网上搜到一篇文章讲了python的一些陷阱可以参考一下。

因此对于这种情况,首先采用一致的导入方式,另外执行代码最好是在包的外面。

你可能感兴趣的:(python中相对导入的问题)