python导入模块的三种方法python 2010-01-22 15:26:30 阅读138 评论0 字号:大中小 订阅
python有三种导入模块的方法:
其一,
import modname
模块是指一个可以交互使用,或者从另一Python 程序访问的代码段。只要导入了一个模块,就可以引用它的任何公共的函数、类或属性。模块可以通过这种方法来使用其它模块的功能。
用import语句导入模块,就在当前的名称空间(namespace)建立了一个到该模块的引用.这种引用必须使用全称,也就是说,当使用在被导入模块中定义的函数时,必须包含模块的名字。所以不能只使用 funcname,而应该使用 modname.funcname
其二,
from modname import funcname
from modname import fa, fb, fc
或者
from modname import *
与第1种方法的区别:funcname 被直接导入到本地名字空间去了,所以它可以直接使用,而不需要加上模块名的限定
* 表示,该模块的所有公共对象(public objects)都被导入到 当前的名称空间,也就是任何只要不是以”_”开始的东西都会被导入。
modname没有被定义,所以modname.funcname这种方式不起作用。并且,如果funcname如果已经被定义,它会被新版本(该导入模块中的版本)所替代。如果funcname被改成指向其他对象,modname不能不会觉察到。
建议:
1)如果你要经常访问模块的属性和方法,且不想一遍又一遍地敲入模块名,使用 from module import
2)如果你想要有选择地导入某些属性和方法,而不想要其它的,使用 from module import
3)如果模块包含的属性和方法与你的某个模块同名,你必须使用import module来避免名字冲突
4)尽量少用 from module import * ,因为判定一个特殊的函数或属性是从哪来的有些困难,并且会造成调试和重构都更困难。
其三
内建函数__import__()
除了前面两种使用import关键字的方法以外,我们还可以使用内建函数 __import__() 来导入 module。两者的区别是,import 后面跟的必须是一个类型(type),而__import__() 的参数是一个字符串,这个字符串可能来自配置文件,也可能是某个表达式计算结果。例如
mymodule = __import__ (’module_name’)
附注:
1)模块的内容都放在一个模块文件中,如 mymodule 的内容应该放在PYTHONPATH 目录下的一个mymodule.py中,C实现的除外
2)包可以将几个模块名称空间组织起来, 如A.b 就表示在包A中的一个子模块b
可以单独导入某一个子模块,如Python文档中给出的例子
import sound.effects.echo
这样必须使用全称对里面的对象进行引用,如
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
还可以使用下面的语句来加载echo子模块
from Sound.Effects import echo
它在没有包前缀的情况下也可以使用, 所以它可以如下方式调用:
echo.echofilter(input, output, delay=0.7, atten=4)
不主张从一个包或模块中用import * 导入所有模块,因为这样的通常会导致可读性很差。
from Package import specific_submodule的用法并没有错,实际上这还是推荐的用法,除非导入的模块需要使用其它包中的同名子模块(the importing module needs to use submodules with the same name from different packages).
综上所述,一般情况应该使用import , 但有几个例外
1)module文档告诉你要用from-import的
2)导入一个包组件。需要一个包里面的某个子模块,一般用from A.b import c比import A.b.c 更方便
且不会冒混淆的危险.
一 动态导入模块
一 动态导入模块
Python的import不能接受变量,所以应该用 __import__函数来动态导入。
如下的代码无法正常导入模块
view plaincopy to clipboardprint?
modules = ['OpenSSL', 'Crypto', 'MySQLdb', 'sqlite3', 'zope.interface', 'pyasn1', 'twisted', 'django']
for each in modules:
try:
import each
except Exception, e:
print e
modules = ['OpenSSL', 'Crypto', 'MySQLdb', 'sqlite3', 'zope.interface', 'pyasn1', 'twisted', 'django']
for each in modules:
try:
import each
except Exception, e:
print e
这样导入会抛出 No module named each 的异常
将 import each 改为 __import__(each)就可以正常导入了。
二 检查模块是否安装
使用__import__函数也可以用来检查模块是否已安装,略微修改上面的代码即可。
使用imp.find_module()来检查不方面,如find_module('zope.interface')会抛出异常——因为这个函数无法查找子模块。
模块加载后,就可以在sys.module这个字典里找到加载的模块名了。
python 导入模块的搜索路径及默认导入的模块2010年03月24日 星期三 20:28
可以在命令行模式下查看这些信息:
sys.modules字典中保存着所有被导入模块的模块名到模块对象的映射
{'copy_reg': <module 'copy_reg' from 'C:\Python26\lib\copy_reg.pyc'>, 'sre_compile': <module 'sre_compile' from 'C:\Python26\lib\sre_compile.pyc'>, 'locale': <module 'locale' from 'C:\Python26\lib\locale.pyc'>, '_sre': <module '_sre' (built-in)>, 'functools': <module 'functools' from 'C:\Python26\lib\functools.pyc'>, 'encodings': <module 'encodings' from 'C:\Python26\lib\encodings\__init__.pyc'>, 'site': <module 'site' from 'C:\Python26\lib\site.pyc'>, '__builtin__': <module '__builtin__' (built-in)>, 'operator': <module 'operator' (built-in)>, '__main__': <module '__main__' (built-in)>, 'types': <module 'types' from 'C:\Python26\lib\types.pyc'>, 'encodings.encodings': None, 'encodings.gbk': <module 'encodings.gbk' from 'C:\Python26\lib\encodings\gbk.pyc'>, 'abc': <module 'abc' from 'C:\Python26\lib\abc.pyc'>, 'errno': <module 'errno' (built-in)>, 'encodings.codecs': None, 'sre_constants': <module 'sre_constants' from 'C:\Python26\lib\sre_constants.pyc'>, 're': <module 're' from 'C:\Python26\lib\re.pyc'>, '_abcoll': <module '_abcoll' from 'C:\Python26\lib\_abcoll.pyc'>, 'ntpath': <module 'ntpath' from 'C:\Python26\lib\ntpath.pyc'>, '_codecs': <module '_codecs' (built-in)>, 'encodings._multibytecodec': None, 'nt': <module 'nt' (built-in)>, '_warnings': <module '_warnings' (built-in)>, 'genericpath': <module 'genericpath' from 'C:\Python26\lib\genericpath.pyc'>, 'stat': <module 'stat' from 'C:\Python26\lib\stat.pyc'>, 'zipimport': <module 'zipimport' (built-in)>, 'encodings.__builtin__': None, 'warnings': <module 'warnings' from 'C:\Python26\lib\warnings.pyc'>, 'UserDict': <module 'UserDict' from 'C:\Python26\lib\UserDict.pyc'>, '_multibytecodec': <module '_multibytecodec' (built-in)>, 'sys': <module 'sys' (built-in)>, 'codecs': <module 'codecs' from 'C:\Python26\lib\codecs.pyc'>, 'os.path': <module 'ntpath' from 'C:\Python26\lib\ntpath.pyc'>, '_functools': <module '_functools' (built-in)>, '_codecs_cn': <module '_codecs_cn' (built-in)>, '_locale': <module '_locale' (built-in)>, 'signal': <module 'signal' (built-in)>, 'linecache': <module 'linecache' from 'C:\Python26\lib\linecache.pyc'>, 'encodings.aliases': <module 'encodings.aliases' from 'C:\Python26\lib\encodings\aliases.pyc'>, 'exceptions': <module 'exceptions' (built-in)>, 'sre_parse': <module 'sre_parse' from 'C:\Python26\lib\sre_parse.pyc'>, 'os': <module 'os' from 'C:\Python26\lib\os.pyc'>, 'encodings._codecs_cn': None}
导入模块时,解释器会搜索sys.path列表,这个列表中保存着一系列目录
['', 'C:\\WINDOWS\\system32\\python26.zip', 'C:\\Python26\\DLLs', 'C:\\Python26\\lib', 'C:\\Python26\\lib\\plat-win', 'C:\\Python26\\lib\\lib-tk', 'C:\\Python26', 'C:\\Python26\\lib\\site-packages']
Python包定义了一个包含目录列表的特殊变量__path__ ,它用于查找包的模块(__path__与sys.path变量的作用相似). 可以在__init__.py文件中访问__path__变量.这个列表的初始值只有一个元素.即包的目录.只要你觉得必要,一个包也可以到其他的目录中去(在__path__增加要搜索的目录)搜索模块,并把搜索到的模块作为该包的模块。(换言之,一个模块可以属于一个包,却不位于这个包所在的目录或子目录下。
import语句将一个源代码文件作为模块导入,为源代码文件中定义的对象(函数,变量等)创建一个名字空间,通过这个名字空间可以访问到模块中定义的函数及变量。在新创建的名字空间里执行源代码文件. 在源代码文件中import 模块,就可以在源代码文件中通过被导入模块的名字空间访问模块中的函数及变量。
使用from语句来导入模块,可以将模块中的对象直接导入到当前的名字空间。from语句不为导入的模块创建新的名字空间引用,而是把被导入模块的一个或多个对象(函数,变量等)直接放入当前的名字空间。