乐趣区

python-import-机制初探

python中,有 module,有packagepackage 都是 module,但module 不一定是 packagemodule 只有一种,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
退出移动版