我对python内置模块和非内置模块感到困惑。这里我使用sys
模块来查找内置模块,
import sys
def dump(module):
print module, "=>",
if module in sys.builtin_module_names:
print "<BUILTIN>"
else:
module = __import__(module)
print module.__file__
dump("os")
dump("sys")
dump("string")
dump("strop")
dump("zlib")
输出:
os => /usr/lib/python2.7/os.pyc
sys => <BUILTIN>
string => /usr/lib/python2.7/string.pyc
strop => <BUILTIN>
zlib => <BUILTIN>
这里我的问题是为什么python家伙将这些模块分开了?这是什么原因。我只需要知道这个,如果有人知道请解释。
答案 0 :(得分:1)
sys.builtin_module_names
中列出的内置模块(__main__
除外)没有__file__
属性。
根据the documentation - Data model:
模块
__file__
是加载模块的文件的路径名(如果是从文件加载的)。 可能缺少__file__
属性 对于某些类型的模块,例如静态的C模块 链接到口译员;用于动态加载的扩展模块 从共享库中,它是共享库文件的路径名。
似乎代码区分它们以避免AttributeError
:
>>> import sys
>>> sys.__file__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '__file__'
但是,sys.builtin_module_names
中没有列出其他模块,但没有__file__
属性。例如:
>>> import cPickle
>>> cPickle.__file__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '__file__'
为避免此异常,应修改函数dump
:
def dump(module):
print module, "=>",
module = __import__(module)
print getattr(module, '__file__', 'No File')