【问题标题】:import in a.py affects module lookup in b.py?a.py 中的导入会影响 b.py 中的模块查找吗?
【发布时间】:2015-05-30 04:05:30
【问题描述】:

这是一个涉及 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 bad”之前“import boto.ec2”,它会起作用,令人惊讶的是:

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

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

版本:

  • python 2.7
  • boto 2.13.3

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

【问题讨论】:

  • 因为你已经将boto.ec2 导入到命名空间中
  • 但是如果你在 bad.py 中“打印 sys.path”,然后“import sys; import bad”,那是行不通的。所以还有更多的事情要做。
  • 这不是一回事,试试echo "import tkinter;print(tkinter.messagebox)" > bad.py,你会得到完全相同的行为

标签: python python-2.7 boto


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    相关资源
    最近更新 更多