标签:no python attribute py python2.7 sys usr path lib64
每天进步一点点
今天遇到一个小错误,AttributeError: module 'calendar' has no attribute 'month'
解决办法:
1、直接将文件名改一下,不要重名即可
2、但是我非要头铁,文件跟模块同名,然后还要导入我要的同名模块,那咋办?
首先找点理论知识补补脑子
Python 解释器是如何查找包和模块的#
Python 执行一个 py 文件,无论执行的方式是用绝对路径还是相对路径,interpreter 都会把文件所在的 directory 加入 sys.path 这个 list 中,并且是索引为 0 的位置。Python 就是在 sys.path 中查找包和模块的。
# test.py
# coding:utf-8
import sys
print(sys.path)
print('Now in main.py')
def hello():
print('michael hello')
if __name__ == '__main__':
hello()
# 执行 python test.py
$ python test.py
['/tmp/module-package/app', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages']
Now in test.py
michael hello
Python 解释器查找包的顺序#
解释器查找包:
- 解释器会默认加载一些 modules,除了
sys.builtin_module_names
列出的内置模块之外,还会加载其他一些标准库,都存放在sys.modules
字典中。 - 然后就是搜索
sys.path
路径下的模块了。
Copy
In [3]: import sys In [4]: print(sys.builtin_module_names) ('_abc', '_ast', '_codecs', '_collections', '_functools', '_imp', '_io', '_locale', '_operator', '_signal', '_sre', '_stat', '_string', '_symtable', '_thread', '_tracemalloc', '_warnings', '_weakref', 'atexit', 'builtins', 'errno', 'faulthandler', 'gc', 'itertools', 'marshal', 'posix', 'pwd', 'sys', 'time', 'xxsubtype', 'zipimport')
这样的查找顺序将会导致同名包或模块被遮蔽。
看到这里就明白了
代码这样处理一下
import sys
_cpath_ = sys.path[0] # 获取当前路径
sys.path.remove(_cpath_) # 删除
import calendar
sys.path.insert(0, _cpath_) # 恢复
sys.path.remove(_cpath_) #删除
这一条可以将path中的第一条删除sys.path.insert(0, _cpath_) #恢复
这一条可以将path恢复成原来的样子
程序总是将上级目录内容定位最高优先级,只要将它暂时屏蔽掉就可以了
参考链接:
https://www.cnblogs.com/michael-xiang/p/10466053.html
https://blog.csdn.net/qq_36530891/article/details/103892175
标签:no,python,attribute,py,python2.7,sys,usr,path,lib64 来源: https://blog.csdn.net/weixin_40131468/article/details/117856251
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。