进口a.b还进口了吗?

时间:2014-02-18 21:41:35

标签: python python-import

当我在包中导入子包时,我可以依赖父包也被导入的事实吗?

e.g。这工作

python -c "import os.path; print os.getcwd()"

我不应该明确import os os.getcwd可用吗?

4 个答案:

答案 0 :(得分:8)

关于包有一个重要的事情,就是加载和可用之间存在差异。

使用import a加载模块a(可以是一个包)并以名称a提供。

使用from a import b加载模块a(肯定是一个包),然后加载模块a.b并使仅使用名称{{ 1}}。请注意,b也在进程中被加载,因此任何初始化都应该发生。

使用a,您同时加载两者并使两者都可用(名称为import a.ba)。

答案 1 :(得分:5)

这是一个很好的问题。如果您查看os.py的源代码,可以找到以下行:

sys.modules['os.path'] = 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。您可能不应该依赖它来获取其他模块。 “明确比隐含更好”是禅的方式。

答案 2 :(得分:2)

它有效且可靠。当你做

时,幕后发生了什么
import os.path

然后导入os,然后导入os.path

答案 3 :(得分:1)

是的,你可以依靠它始终工作。 Python必须在os的命名空间中包含os.path才能工作。

使用from os import path表示法不起作用。在这种情况下,os模块进入命名空间,只有path