Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 导入a.b也导入a?_Python_Python Import - Fatal编程技术网

Python 导入a.b也导入a?

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

当我在一个包中导入一个子包时,我能依赖于父包也被导入这一事实吗

e、 g.这很有效

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