Python导入模块vs import _module

时间:2013-04-11 09:35:49

标签: python python-import python-module

在Aptana中配置PyDev的Forced Builtins时,我注意到默认情况下引用了一些模块,并带有_(下划线)前缀。

所以我打开一个Python解释器,令我惊讶的是,下面的导入工作:

import ast
import _ast
import bisect
import _bisect
import csv
import _csv
# ... and so on

现在,如果我对导入的模块执行dir(),我会看到不同的内容:

>>> dir(csv)
['Dialect', 'DictReader', 'DictWriter', 'Error', ...] # and so on
>>> dir(_csv)
['Dialect', 'Error', ...] # node that DictReader and DictWriter are missing

最后,help()告诉我他们显然是不同的模块:

>>> help(_csv)
Help on module _csv:

NAME
    _csv - CSV parsing and writing.

FILE
    /usr/lib64/python2.6/lib-dynload/_csv.so
...

>>> help(csv)
Help on module csv:

NAME
    csv - CSV parsing and writing.

FILE
    /usr/lib64/python2.6/csv.py
...

那么,import moduleimport _module之间有什么区别? 背后是否有惯例或类似的东西?

2 个答案:

答案 0 :(得分:5)

某些模块使用某些 C代码来实现需要速度的部分。 main 模块仍然使用Python胶水,_module版本包含C扩展名。

例如参见csv.py module;它从大多数功能的_csv.c C library导入,只有DialectSnifferDictReaderDictWriter类在纯Python中实现。

module_module约定就是一个惯例。并非所有C扩展都遵循这种模式。

答案 1 :(得分:4)

_module通常是用C语言编写的模块的一部分。module是一个python包装器。您不应该自己导入_modules