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

Python a.py中的导入是否会影响b.py中的模块查找?,python,python-2.7,boto,Python,Python 2.7,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忘记了“导入boto.ec2”。但是,如果您

下面是一个涉及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忘记了“导入boto.ec2”。但是,如果您在“import bad”之前“import boto.ec2”,它会工作,令人惊讶的是:

python -c "import boto.ec2; import bad"
这里发生了什么?我的理解是,从一个文件导入只会填充该文件的名称空间,但这肯定是错误的

版本:

  • python 2.7
  • boto 2.13.3

顺便说一句,我可以用我自己的虚拟版本的boto复制这个,基本上只是空白文件,因此,我认为这不是boto特有的问题。

在一个文件中导入模块不会将其加载到其他文件的命名空间中-但是
import boto
import boto.ec2
都只会将
boto
包添加到当前命名空间中。不同之处在于,
import boto.ec2
还加载
boto
包的
ec2
子模块,并将其分配给
boto命名空间中的
ec2
变量。由于导入
boto
的每个模块都共享相同的
boto
包,因此它们都看到了这个新的添加。

在一个文件中导入模块不会将其加载到其他文件的名称空间中,但是
import boto
import boto.ec2
都只将
boto
包添加到当前名称空间中。不同之处在于,
import boto.ec2
还加载
boto
包的
ec2
子模块,并将其分配给
boto命名空间中的
ec2
变量。由于导入
boto
的每个模块都共享相同的
boto
包,因此它们都会看到这个新的添加。

因为您已将
boto.ec2
导入到名称空间中,但如果在bad.py中“print sys.path”,然后在“import sys;import bad”中执行,则无法工作。因此,还有更复杂的事情要做。这不是同一件事,请尝试
echo“import tkinter;print(tkinter.messagebox)”>bad.py
,您将得到完全相同的行为,因为您已将
boto.ec2
导入到名称空间中,但如果您在bad.py中“print sys.path”,然后是“import sys;import bad”,则不起作用。因此,还有更复杂的事情要做。这不是同一件事,请尝试
echo“import tkinter;print(tkinter.messagebox)”>bad.py
,您将得到完全相同的行为