Python - os.path 不存在: AttributeError: 'module' 对象没有属性 'path'。

8

针对我突然在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答案,最常见的建议是,在sys.path中必须有另一个流氓的os.py,并且它已被加载,而不是内置的。但我检查了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 脚本。

2个回答

6
在浪费了很多时间之后,我终于找到了解决方法。在查看 C:\Programs\Python273\Lib 目录下的文件时,我注意到 os.pyc 的大小比 os.pyos.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中显示的方式)(注意:os.pyt 文件名末尾的 t 不是文件名的一部分。)

删除此文件(以及另外两个具有相同故事的 .pyc 文件)解决了问题。

因此,发生的情况必须是某种原因导致 python 重新编译了 os 成为 os.pyc(为什么?如果已经编译过了,为什么还要重新编译?),并输出了文件的第一部分(该部分本身就是有效的文件),然后强制关闭发生在它有机会输出其余部分之前。这就是当操作不是原子操作时发生的令人沮丧的问题的示例。

另外,结果证明我本可以更快地找到问题,因为执行以下操作:

>>> inspect.getfile(os)
'C:\\Programs\\Python273\\lib\\os.pyc'

即使没有可用的os.path,仍然可以正常工作。


1
你也可以使用 os.__file__ - user2357112

0

我有同样的问题,C:\Python27\Lib\os.py根本没有readlink()函数。在Lib中搜索了6个位置,发现它被使用但没有定义:

Python 2.7 (r27:82525, Jul 4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接