调查一下我开始使用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__']
查看其他一些'module' object has no attribute
答案,最常见的建议是os.py
中某处必须有另一个流氓sys.path
,并且它已被加载,而不是内置的在一个。但我检查了PYTHONPATH
环境变量,并在当前目录中,没有任何其他os.py
。
所以我找了一种方法来查找定义实体的文件的名称,毫不奇怪,Python以inspect
模块的形式有such a facility。
>>> 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'
所以inspect
依赖于os.path
,然后我的想法用完了。
我最近没有安装任何新东西。唯一发生的事情是我必须做的强制关机,这可能与运行Python脚本同时发生,因为当机器无响应并且发生强制关机时,我在循环中反复运行一个简短的Python脚本。
答案 0 :(得分:5)
浪费了很多时间后,我想通了。在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'
在os.path
不可用时仍然有效。
答案 1 :(得分:0)
我有同样的问题,C:\ Python27 \ Lib \ os.py根本没有readlink()函数。搜索了Lib并找到了它使用的6个步骤,但没有定义:
Python 2.7(r27:82525,2010年7月4日,09:01:59)[MSC v.1500 32位(英特尔)]在win32上
C:\Python27\Lib\pdb.py(1194): dirname = os.readlink(dirname)
C:\Python27\Lib\platform.py(952): os.path.join(os.path.dirname(filepath),os.readlink(filepath)))
C:\Python27\Lib\posixpath.py(386): resolved = os.readlink(path)
C:\Python27\Lib\rexec.py(146): ok_posix_names = ('error', 'fstat', 'listdir', 'lstat', 'readlink',
C:\Python27\Lib\shutil.py(183): linkto = os.readlink(srcname)
C:\Python27\Lib\tarfile.py(1873): linkname = os.readlink(name)