python 模块导入问题
本文介绍了python 模块导入问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
在看到eventlet
文件的时候,有个select.py
文件有这样的几行,这个导入,导入的是哪个文件?
__select = __import__('select')
error = __select.error
from eventlet.greenthread import getcurrent
from eventlet.hubs import get_hub
from eventlet.support import six
这个文件本身的文件名就是select.py
,请问第一行是什么意思?导入的是哪个select
文件?
解决方案
纠正一下,.py
文件应该被称作模块(module)
。
正常情况下,这样确实是导入自己,但我刚去github
上看了一下eventlet
中select.py
的源码,它本身并没有error
这个对象,那么第二行就不对。
所以,这里引入的select
是Python
标准模块中的select
,该模块中也确实有error
对象:
In [5]: import select
In [6]: print select.error
<class 'select.error'>
因此,这两行代码相当于对Python
标准模块select
进行了继承或重写。
但这里有个问题,正常情况下,如果我们写一个与标准模块名称相同的.py
文件,然后引入自己,Python
解释器会优先引入.py
模块本身,而不是标准模块,我自己也写了一个select.py
:
__select = __import__('select')
print __select
输出结果如下:
<module 'select' from 'D:\home\codes\codes2\select.py'>
正是该模块当前的路径。
那么怎么样才能引入标准模块呢?只需加几句话:
import sys
sys.path.append(sys.path[0])
sys.path.pop(0)
__select = __import__('select')
print __select
输出结果:
<module 'select' from 'C:\Python27\DLLs\select.pyd'>
默认情况下,当前模块的路径在sys.path[0]
中,我们把该路径添加到sys.path
列表末尾,并移除0
位置的路径,此时,Python
解释器在查找模块时,当前模块的优先度低于标准库,因此就会以标准库为先。
evenlet
的selet.py
中好像没有那几句,我猜应该是放到其他py
文件中了……
这篇关于python 模块导入问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文