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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理