代码:
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)`
答案 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']