Evg*_*eev 6 python path corruption built-in python-import
调查一下我开始用gdb-python突然得到的一个奇怪的错误,我把它简化为:
C:\Users\User>python -i
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win 32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> dir(os.path)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'path'
>>> dir(os)
['__builtins__', '__doc__', '__file__', '__name__', '__package__']
Run Code Online (Sandbox Code Playgroud)
通过其他一些'module' object has no attribute答案,最常见的建议是,os.py某个地方必须有另一个流氓sys.path,并且它正在加载,而不是内置的.但我检查了PYTHONPATH环境变量,并在当前目录中,并没有任何其他os.py.
因此,我找到了一种方法来查找定义实体的文件的名称,并且毫不奇怪,Python 以模块的形式具有这样的功能inspect.
>>> inspect.getsourcelines(os)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Programs\Python273\lib\inspect.py", line 690, in getsourcelines
lines, lnum = findsource(object)
File "C:\Programs\Python273\lib\inspect.py", line 527, in findsource
sourcefile = getsourcefile(object)
File "C:\Programs\Python273\lib\inspect.py", line 451, in getsourcefile
if os.path.exists(filename):
AttributeError: 'module' object has no attribute 'path'
Run Code Online (Sandbox Code Playgroud)
所以inspect依靠os.path,然后我没有想法.
我最近没有安装任何新东西.唯一发生的事情是我必须做的强制关机,这可能与运行Python脚本同时发生,因为当机器无响应并且发生强制关机时,我在循环中反复运行一个简短的Python脚本.
在浪费了很多时间后,我想通了.展望下C:\Programs\Python273\Lib,我注意到,os.pyc在尺寸上比小得多os.py和os.pyo,而其他模块abc.pyc的大小等于abc.pyo和略小abc.py.从里面看os.pyc,它只包含:
^Có
\{GOc^@^@^@^@^@^@^@^@^A^@^@^@@^@^@^@s^D^@^@^@d^@^@S(
^A^@^@^@N(^@^@^@^@(^@^@^@^@(^@^@^@^@(^@^@^@^@s^_^@^@
^@C:\Programs\Python273\lib\os.pyt^H^@^@^@<module>^A
^@^@^@s^@^@^@^@
(这是它在Vim中的显示方式.)(注意:t末尾os.pyt不是文件名的一部分.)
删除此文件(以及.pyc具有相同故事的其他两个文件)解决了该问题.
到底发生了什么,必须是python被重新编译os成os.pyc某种原因(为什么呢?如果它之前已经编译?),并具有输出文件的第一部分(这是由自身文件有效),那么它有前发生的强行关机有机会输出其余的.因此,这是操作不是原子的时候发生的令人沮丧的问题的一个例子.
而且,事实证明我可以更快地跟踪它,因为这样做
>>> inspect.getfile(os)
'C:\\Programs\\Python273\\lib\\os.pyc'
Run Code Online (Sandbox Code Playgroud)
当os.path没有时仍然有效.