BUILTIN模块和非内置模块有什么区别?

时间:2014-02-26 09:37:03

标签: python sys

我对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家伙将这些模块分开了?这是什么原因。我只需要知道这个,如果有人知道请解释。

1 个答案:

答案 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')