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"
这是怎么回事?我的理解是从一个文件导入只会填充该文件的命名空间,但这一定是错误的。
版本:
- python2.7
- boto 2.13.3
顺便说一句,我能够用我自己的虚拟版本的 boto 重现这个,那基本上只是空白文件,所以我不认为这是一个特定于 boto 的问题。
在一个文件中导入模块不会将其加载到其他文件的命名空间中 - 但 import boto
和 import boto.ec2
都只会将 boto
包添加到当前命名空间中。不同的是import boto.ec2
还加载了boto
包的ec2
子模块,并赋值给boto
[=中的ec2
变量23=]的命名空间。由于导入 boto
的每个模块都共享相同的 boto
包,因此它们都可以看到这个新增内容。
这是一个涉及 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"
这是怎么回事?我的理解是从一个文件导入只会填充该文件的命名空间,但这一定是错误的。
版本:
- python2.7
- boto 2.13.3
顺便说一句,我能够用我自己的虚拟版本的 boto 重现这个,那基本上只是空白文件,所以我不认为这是一个特定于 boto 的问题。
在一个文件中导入模块不会将其加载到其他文件的命名空间中 - 但 import boto
和 import boto.ec2
都只会将 boto
包添加到当前命名空间中。不同的是import boto.ec2
还加载了boto
包的ec2
子模块,并赋值给boto
[=中的ec2
变量23=]的命名空间。由于导入 boto
的每个模块都共享相同的 boto
包,因此它们都可以看到这个新增内容。