首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BUILTIN模块和非内建模块有什么区别?

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

Stack Overflow用户
提问于 2014-02-26 09:37:03
回答 1查看 854关注 0票数 2

我混淆了python内置模块和非内置模块。这里我使用sys模块来查找内置模块,

代码语言:javascript
复制
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")

输出:

代码语言:javascript
复制
os => /usr/lib/python2.7/os.pyc
sys => <BUILTIN>
string => /usr/lib/python2.7/string.pyc
strop => <BUILTIN>
zlib => <BUILTIN>

这里我的问题是为什么python的人将这些模块分开?有什么原因吗。我只想知道这件事,如果有人知道请解释。

EN

回答 1

Stack Overflow用户

发布于 2014-02-26 09:43:37

sys.builtin_module_names中列出的内置模块(__main__除外)没有__file__属性。

根据文档-数据模型

模块 __file__是从其中加载模块的文件的路径名,如果它是从文件加载的。对于某些类型的模块,例如静态链接到解释器__file__的C模块,可能缺少属性;对于从共享库动态加载的扩展模块,它是共享库文件的路径名。

为了避免AttributeError,代码似乎将它们区分开来。

代码语言:javascript
复制
>>> 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__属性。例如:

代码语言:javascript
复制
>>> import cPickle
>>> cPickle.__file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '__file__'

为了避免这种异常,应该修改函数dump

代码语言:javascript
复制
def dump(module):
    print module, "=>",
    module = __import__(module)
    print getattr(module, '__file__', 'No File')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22037251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档