Python a.py中的导入是否会影响b.py中的模块查找?
下面是一个涉及boto的测试示例(尽管我不认为这是boto特有的)。首先创建一个简单的python文件: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”。但是,如果您
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
,您将得到完全相同的行为