我正在用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)
答案 0 :(得分:2)
问题几乎可以肯定,您yopy.py
中还有其他名为yopy.pyc
,yopy
或sys.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
左右会导致更多的混淆......)