a.py 中的导入会影响 b.py 中的模块查找吗?

import in a.py affects module lookup in b.py?

这是一个涉及 boto 的测试示例(尽管我认为这不是特定于 boto 的)。首先创建一个简单的 python 文件:

echo "import boto; print boto.ec2.RegionData" > bad.py

然后如果你尝试导入这个模块,你会得到一个错误:

python -c "import bad"
AttributeError: 'module' object has no attribute 'ec2'

这是预料之中的,因为 bad.py 忘记了 "import boto.ec2"。但是,如果您 "import boto.ec2" 就在 "import bad" 之前,它会令人惊讶地起作用:

python -c "import boto.ec2; import bad"

这是怎么回事?我的理解是从一个文件导入只会填充该文件的命名空间,但这一定是错误的。

版本:

顺便说一句,我能够用我自己的虚拟版本的 boto 重现这个,那基本上只是空白文件,所以我不认为这是一个特定于 boto 的问题。

在一个文件中导入模块不会将其加载到其他文件的命名空间中 - 但 import botoimport boto.ec2 都只会将 boto 包添加到当前命名空间中。不同的是import boto.ec2还加载了boto包的ec2子模块,并赋值给boto[=中的ec2变量23=]的命名空间。由于导入 boto 的每个模块都共享相同的 boto 包,因此它们都可以看到这个新增内容。