3 回答
TA贡献1765条经验 获得超5个赞
您似乎误解了如何import搜索模块。当您使用import语句时,它总是搜索实际的模块路径(和/或sys.modules); 它不会使用由于先前导入而存在的本地命名空间中的模块对象。当你这样做时:
import package.subpackage.module
from package.subpackage import module
from module import attribute1
第二行查找名为的包package.subpackage并module从该包导入。该行对第三行没有影响。第三行只是查找一个名为的模块module,但没有找到。它不会“重复使用” module您从上面的行中调用的对象。
换句话说from someModule import ...,并不意味着“来自我之前导入的名为someModule的模块......”它意味着“来自在sys.path上找到的名为someModule的模块......”。没有办法通过导入导致它的包来“逐步”构建模块的路径。导入时始终必须引用整个模块名称。
目前尚不清楚你想要实现的目标。如果您只想导入特定对象attribute1,只需执行即可from package.subpackage.module import attribute1。package.subpackage.module一旦你从中输入了你想要的名字,你就不用担心。
如果您确实希望以后可以访问该模块以访问其他名称,那么您可以这样做,from package.subpackage import module并且如您所见,您可以随心所欲地执行此操作module.attribute1等等。
如果你想要两者 - 也就是说,如果你想attribute1直接访问并且想要module访问,那么只需执行上述两项操作:
from package.subpackage import module
from package.subpackage.module import attribute1
attribute1 # works
module.someOtherAttribute # also works
如果你不喜欢打字package.subpackage两次,你可以手动创建对attribute1的本地引用:
from package.subpackage import module
attribute1 = module.attribute1
attribute1 # works
module.someOtherAttribute #also works
TA贡献1777条经验 获得超3个赞
#2失败的原因是因为sys.modules['module']不存在(导入例程有自己的作用域,并且看不到module本地名称),并且module磁盘上没有模块或包。请注意,您可以用逗号分隔多个导入的名称。
from package.subpackage.module import attribute1, attribute2, attribute3
也:
from package.subpackage import module
print module.attribute1
TA贡献1799条经验 获得超6个赞
如果您要做的就是在全局命名空间中获取attribute1,那么版本3似乎没问题。为什么它是过度杀伤前缀?
在版本2中,而不是
from module import attribute1
你可以做
attribute1 = module.attribute1
添加回答
举报