进口ab也进口了?

ana*_*gue 11 python python-import

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

这样可行

python -c "import os.path; print os.getcwd()"
Run Code Online (Sandbox Code Playgroud)

我不应该明确import osos.getcwd是可用?

Alf*_*lfe 8

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

import a你加载模块a(可以是一个包)并使其在名称下可用a.

随着from a import b你加载模块a(肯定是一个包),然后加载模块a.b,在名称下可用b.请注意,a在进程中也加载了,因此任何初始化都应该发生.

随着import a.b你加载两个并使两者都可用(在名称a和下a.b).

  • @adsmith:这只是`os.path`的一个奇怪之处:`os`包`__init__`故意导入`path`以使其可用作`os.path`.通常,不,两个名称都不可用.(还有时间编辑这个!正如user2357112指出的那样,我对`__init__`错了.) (5认同)

aus*_*tin 5

这是一个很好的问题。如果您查看源代码,os.py则会发现以下行:

sys.modules['os.path'] = path
Run Code Online (Sandbox Code Playgroud)

这就是我们的模块。那是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
Run Code Online (Sandbox Code Playgroud)

基本上,os.path在这种情况下是特殊的。

简短版: Python在幕后做了一些工作os.path。您可能不应该依赖它来获取其他模块。禅宗的方式是“显式胜于隐式”。


fre*_*ish 2

它有效且可靠。当你这样做时,幕后会发生什么

import os.path
Run Code Online (Sandbox Code Playgroud)

然后os导入然后os.path.