Python 导入a.b也导入a?
当我在一个包中导入一个子包时,我能依赖于父包也被导入这一事实吗 e、 g.这很有效Python 导入a.b也导入a?,python,python-import,Python,Python Import,当我在一个包中导入一个子包时,我能依赖于父包也被导入这一事实吗 e、 g.这很有效 python -c "import os.path; print os.getcwd()" 我是否应该明确地导入操作系统,以便os.getcwd可用?它可以工作,而且是可靠的。引擎盖下发生的事情是当你这样做的时候 import os.path 然后导入os,然后导入os.path是的,您可以依靠它始终工作。Python必须在命名空间中包含os,才能使os.path正常工作 不起作用的是使用from os im
python -c "import os.path; print os.getcwd()"
我是否应该明确地
导入操作系统
,以便os.getcwd
可用?它可以工作,而且是可靠的。引擎盖下发生的事情是当你这样做的时候
import os.path
然后导入
os
,然后导入os.path
是的,您可以依靠它始终工作。Python必须在命名空间中包含os
,才能使os.path
正常工作
不起作用的是使用
from os import path
符号。在这种情况下,操作系统模块不会被带到名称空间中,只有path
这是一个好问题。如果查看os.py
的源代码,您会发现这一行:
sys.modules['os.path'] = path
这就是我们的模块。但是路径是什么呢?这取决于你的操作系统。对于Windows,它在以下块中定义:
elif 'nt' in _names:
name = 'nt'
linesep = '\r\n'
from nt import *
try:
from nt import _exit
except ImportError:
pass
import ntpath as path
import nt
__all__.extend(_get_exports_list(nt))
del nt
基本上,
os.path
在这个上下文中是特殊的
简短版本:Python在幕后做了一些事情,以制作
os.path
。您可能不应该依赖它来获取其他模块。“显式优于隐式”是禅宗的说法。关于软件包,有一件重要的事情需要知道,那就是加载和可用之间有区别
使用import a
加载模块a
(可以是一个包),并以a
的名称使其可用
使用导入b中的加载模块a
(这肯定是一个软件包),然后加载模块a.b
,并仅在名称b
下提供此功能。请注意,a
也在这个过程中被加载,因此任何应该进行的初始化都将发生
使用import a.b
,您可以加载并使两者都可用(名称为a
和a.b
)。我不明白这个问题:如果它有效,那么问题出在哪里?@freakish:它保证对所有包都有效吗?@freakish:我相信他在问为什么有效,如何有效,我能依靠它吗,这似乎是不一致的行为。为什么不直接导入操作系统
,然后做os.path.join
或者你做了什么?@adsmith我不明白你的问题。什么是不一致的?我不是说要用它,我是说这是一个功能。没有人必须使用它。“应该有一种——最好只有一种——显而易见的方法来实现它。”但是import os
和import os.path
做同样的事情。它与Python的禅宗思想不一致,这就是我质疑它的原因。MarkDickinson和Alfe在下面的评论中回答了我os.path
是一个奇怪的东西,因为os
在其\uuuu init\uuuu
中导入它。大多数模块的工作方式都不是这样的,import a
也会导入a.b
@adsmith,这是正确的。在这种情况下,有两种方法恰好是相同的。还要注意的是,实际上大多数模块都进行这种嵌套导入。但是,import a
也使这两个名称都可用,不是吗<代码>导入操作系统;os.path.join(“this”、“works”、“without”、“import os.path”)@adsmith:这只是os.path
的一个奇怪之处:os
包\uuu init\uuuuu
故意导入path
以使其作为os.path
可用。一般来说,不会,两个名字都不可用。(还是编辑这个的时候了!正如user2357112指出的,我对\uuuu init\uuuu
的理解是错误的)是的,这是一个特例<代码>操作系统。路径由os
中的代码“手动”添加。如果您在a
中只有b
的目录结构,那么您需要显式地导入a.b
,以使b
可用。@MarkDickinson谢谢,这就是我想要的答案。@MarkDickinson:os
不是一个包,它没有\uu init\uuu
。它直接与sys.modules
通信,使import os.path
工作。os.path
是特殊的,但导入规则不受这种特殊情况的影响。如果执行导入scipy.stats
,也会发生同样的情况。stats
子模块通常不随scipy一起导入。但是执行importscipy.stats
也会导入scipy
。