Python导入模块vs import _module

E.Z*_*.Z. 1 python python-module python-import

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

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

import ast
import _ast
import bisect
import _bisect
import csv
import _csv
# ... and so on
Run Code Online (Sandbox Code Playgroud)

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

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

最后,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
...
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 5

一些模块使用一些 C代码来实现需要速度的部件.该模块还是使用Python胶水和_module版本包含的C扩展.

参见例如csv.py模块 ; 它从进口_csv.cC库的大部分功能,仅使用Dialect,Sniffer,DictReaderDictWriter在纯Python实现的类.

module_module惯例是仅仅是一个惯例.并非所有C扩展都遵循此模式.