为什么我的代码不打印`os.path`

zjm*_*126 1 python import module

对于代码:

def a(x):
    if x=='s':
        __import__('os') #I think __import__ == import
        print os.path
Run Code Online (Sandbox Code Playgroud)

为什么不print a('os')打印os.path?


我的下一个问题是:为什么以下代码使用__import__('some')而不是像a = __import__('os')

def import_module(name, package=None):
    if name.startswith('.'):
        if not package:
            raise TypeError("relative imports require the 'package' argument")
        level = 0
        for character in name:
            if character != '.':
                break
            level += 1
        name = _resolve_name(name[level:], package, level)
    __import__(name)            #Why does it do this
    return sys.modules[name]    #Instead of `return __import__(name)`
Run Code Online (Sandbox Code Playgroud)

HS.*_*HS. 11

__import__返回一个模块.它实际上并没有向当前命名空间添加任何内容.

您可能只想使用import os:

def a(x):
    if x=='s':
        import os
        print os.path
a('s')
Run Code Online (Sandbox Code Playgroud)

或者,如果要将模块作为字符串导入,则可以显式指定:

def a(x):
    if x=='s':
        os = __import__('os')
        print os.path
a('s')
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 5

@ statictype.org的答案是正确的(__import__不绑定本地命名空间中的任何名称),但为什么你想要打印<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.pyc'>或同样奇怪的东西取决于你的平台?!print os.path一旦你修复了你的bug,就是你将要做的事情- 你想要实现的目标是什么?!

你确定你不想要的东西完全不同,例如print os.environ['PATH']或者print os.getcwd()......?

编辑:回答OP的后续问题:

__import__(name)#why it do this
return sys.modules[name]
Run Code Online (Sandbox Code Playgroud)

__import__确实安装了导入的内容sys.modules; 这比

return __import__(name)
Run Code Online (Sandbox Code Playgroud)

如果name包含一个或多个.s(点):在这种情况下,__import__返回顶级模块,但sys.modules具有真实性.例如:

return __import__('foo.bar')
Run Code Online (Sandbox Code Playgroud)

相当于

__import__('foo.bar')
return sys.modules['foo']
Run Code Online (Sandbox Code Playgroud)

不像人们想的那样

__import__('foo.bar')
return sys.modules['foo.bar']
Run Code Online (Sandbox Code Playgroud)