python
中,有 module
,有package
。package
都是 module
,但module
不一定是 package
。module
只有一种,package
有 2 种。
import 的搜索机制
考虑有如下代码结构
.
├── cat
│ ├── __init__.py
│ ├── cat.py
│ └── moo.py
└── dog
├── __init__.py
└── dog.py
2 directories, 5 files
情况 1:
# ./cat/cat.py
import moo
其余文件为空。如果我们用运行命令:python cat/cat.py
,则程序正常运行;如果运行命令;python -m cat.cat
,则会报错;
情况 2:
# ./cat/cat.py
from . import moo
则运行结果相反。
情况 1:
- 当我们运行
python cat/cat.py
时,这时候系统的搜素路径包括./cat/
,我们可以通过在./cat/cat.py
中添加import sys; print(sys.path)
证实这一点。 - 当我们运行
python -m cat.cat
是,系统的搜索路径只包括.
,也就是当前文件夹,我们可以通过在当前文件夹下添加一个moo.py
文件,这样python -m cat.cat
就不会报错了。可见,这时的搜索空间,不包括子文件夹。
情况 2:
情况 2 其实和情况 1 很不一样,情况 2 叫做 relative import
,也就是间接引用,间接引用,只能在包内使用,也就是说,只能通过python -m cat.cat
来使用,我还不知道有什么修补措施,能让它用非包的方式,而不报错。
代码重载:importlib.reload
使用 importlib.reload
会重载当前代码。
import os
import importlib
import foo
print("foo.a: {}".format(foo.a))
command = 'echo a=2 >> foo.py'
print(command)
os.popen(command)
importlib.reload(foo)
print("foo.a: {}".format(foo.a))
输出:
foo.a: 2
echo a=2 >> foo.py
foo.a: 2