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)
@ 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)
| 归档时间: |
|
| 查看次数: |
5400 次 |
| 最近记录: |