为什么我得到 AttributeError?
Why I'm getting AttributeError?
我正在 python ( https://github.com/parthanium/YoPy ) 中使用 Yo api 进行申请,但出现了一个非常奇怪的错误。
因此,我已将存储库克隆到我的工作区中,并创建了以下文件 (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()
现在的问题:
我有一个项目包含以前的项目(Yo api in python)作为 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()
我在 运行ning:
时得到以下错误输出
<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'...
编辑:
尝试了 'print yopy.file',结果是 https://gist.github.com/pedrorijo91/4fb4defe7a7c2d8a2fdc(感谢@abarnert)
问题几乎可以肯定是您的 sys.path
中有其他名称为 yopy.py
、yopy.pyc
或 yopy
的东西,很可能在当前工作目录中您正在尝试 运行 此来源。它可能是同一个库的旧版本,或者你编写的一些测试程序来测试这个库,或者一些不同的同名项目。
现在,您的 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
只会导致更多混乱......)
我正在 python ( https://github.com/parthanium/YoPy ) 中使用 Yo api 进行申请,但出现了一个非常奇怪的错误。
因此,我已将存储库克隆到我的工作区中,并创建了以下文件 (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()
现在的问题:
我有一个项目包含以前的项目(Yo api in python)作为 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()
我在 运行ning:
时得到以下错误输出<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'...
编辑: 尝试了 'print yopy.file',结果是 https://gist.github.com/pedrorijo91/4fb4defe7a7c2d8a2fdc(感谢@abarnert)
问题几乎可以肯定是您的 sys.path
中有其他名称为 yopy.py
、yopy.pyc
或 yopy
的东西,很可能在当前工作目录中您正在尝试 运行 此来源。它可能是同一个库的旧版本,或者你编写的一些测试程序来测试这个库,或者一些不同的同名项目。
现在,您的 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
只会导致更多混乱......)