调查我突然开始使用 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
模块的形式提供了
这样的工具。
>>> 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 脚本。
在浪费了很多时间之后,我想通了。查看
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^@^@^@^A ^@^@^@s^@^@^@^@
(这是它在 Vim 中的显示方式。)(注意:
t
末尾的 os.pyt
不是文件名的一部分。)
删除此文件(以及具有相同故事的其他两个
.pyc
文件)解决了问题。
所以发生的事情一定是
python
出于某种原因将os
重新编译为os.pyc
(为什么?如果它之前已经编译过?)并输出了文件的第一部分(它本身作为文件是有效的) ),然后在它有机会输出其余部分之前就发生了强制关闭。所以这是当操作不是原子时发生的令人沮丧的问题的一个例子。
而且,事实证明我可以更快地找到它,因为这样做
>>> inspect.getfile(os)
'C:\\Programs\\Python273\\lib\\os.pyc'
当 os.path
不可用时,仍然有效。
我有同样的问题,C:\Python27\Lib\os.py 根本没有 readlink() 函数。搜索了 Lib,发现 6paces 正在使用,但没有定义:
Win32 上的 Python 2.7(r27:82525,2010 年 7 月 4 日,09:01:59)[MSC v.1500 32 位(Intel)]
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)
Evgeni 您能否告知您删除了哪些 .pyc 文件以使其正常工作?谢谢!