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

时间:2009-12-28 02:09:58

标签: python import module

代码:

def a(x):
    if x=='s':
        __import__('os') #I think __import__ == import
        print os.path

为什么不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)`

2 个答案:

答案 0 :(得分:11)

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

您可能只想使用import os

def a(x):
    if x=='s':
        import os
        print os.path
a('s')

或者,如果要将模块作为字符串导入,可以明确指定它:

def a(x):
    if x=='s':
        os = __import__('os')
        print os.path
a('s')

答案 1 :(得分:5)

@ statictype.org的答案是正确的(__import__没有绑定本地命名空间中的任何名称),但为什么你要打印<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.pyc'>或同样奇怪的东西,具体取决于你的平台?!这就是print os.path修复错误后会做的事情 - 你想要完成什么

您确定不需要完全不同的内容,例如print os.environ['PATH']print os.getcwd() ......

修改:回答OP的后续问题:

__import__(name)#why it do this
return sys.modules[name]

__import__会安装sys.modules中的导入内容;这比

更好
return __import__(name)

如果name包含一个或多个. s(点):在这种情况下,__import__会返回顶级模块,但是{{1有真实的东西。例如:

sys.modules

相当于

return __import__('foo.bar')

正如人们想象的那样

__import__('foo.bar')
return sys.modules['foo']