为什么我得到AttributeError?

时间:2015-04-22 20:25:57

标签: python git-submodules

我正在用python(https://github.com/parthanium/YoPy)中的Yo api进行应用程序,我收到一个非常奇怪的错误。

所以,我已将repo克隆到我的工作区,并且我创建了以下文件(test.py),当我运行'python test.py'时,该文件按预期工作:

import yopy

token = "secret"
username = "testUser"
link = "https://github.com/parthanium/YoPy"

yo = yopy.Yo(token)
print yo
print yo.number()

现在出现问题:

我有一个项目,包括以前的项目(在Python中的Yo api)作为git子模块:

yo/
├── README.md
├── gitmodules
│   └── yopy
│       ├── LICENSE
│       ├── README.md
│       └── yopy.py
└── yo.py

yo.py文件包含以下内容:

import sys
sys.path.append("gitmodules/yopy")
import yopy
import struct

token = "secret"
username = "testUser"
link = "https://github.com/parthanium/YoPy"

yo = yopy.Yo(token)
print yo
print dir(yo)
print yo.number()

运行时收到以下错误输出:

<yopy.Yo object at 0x10cc29190>
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_session', 'token', 'user', 'yo', 'yo_all']
Traceback (most recent call last):
  File "yo.py", line 13, in <module>
    print yo.number()
AttributeError: 'Yo' object has no attribute 'number'

为什么我收到此错误? dir(yo)输出奇怪的属性,如'yo_all'和'yo','user'......

编辑: 尝试'打印yopy。文件',结果为https://gist.github.com/pedrorijo91/4fb4defe7a7c2d8a2fdc(感谢@abarnert)

1 个答案:

答案 0 :(得分:2)

问题几乎可以肯定,您yopy.py中还有其他名为yopy.pycyopysys.path的内容,很可能是您当前的工作目录中重新尝试从中运行。它可能是同一个库的旧版本,也可能是您为测试库而编写的一些测试程序,或者是一些具有相同名称的不同项目。

现在,您的sys.path.append("gitmodules/yopy")会将正确的目录添加到导入程序搜索路径中,但会将其添加到 end ,而不是 start 。所以,如果有./yopy.py./gitmodules/yopy/yopy.py,那么它就是Python要导入的第一个。

您可以通过print yopy.__file__查看导入的内容。或者,更好,import inspect然后print inspect.getsourcefile(yopy)

假设这是问题所在,解决方法是摆脱名称冲突的另一件事。 (你可以而只是将sys.path.append(…)更改为sys.path.insert(0, …),但让其他yopy左右会导致更多的混淆......)