问题一:使用了相对导入,但是执行时报 “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的一些陷阱可以参考一下。
因此对于这种情况,首先采用一致的导入方式,另外执行代码最好是在包的外面。