其实这个问题的本质是:Python语法里面点操作符"."在不同语境下的不同含义。访问boto.ec2的时候,是从boto获取ec2属性;而在import语句里面,boto.ec2只是一个module或者package的名字,只不过Python碰巧用和前述语境下同样的操作符.来分割package和sub-package。而在文件系统上,package和sub-package是用/来区分的。如果Python也用/,那么文章开头的语句就变成了import boto/ec2,和from boto/ec2 import xxx。这样也就不会有开头的困惑了。
另外,import ec2只是执行了ec2/__init__.py文件,因为这个文件里面没有引入或者定义ec2这个名字,所以访问boto.ec2会出错。