我正在尝试使用以下python脚本找到我Mac的当前位置。它使用的是python objective-C桥,它有时会起作用。但是有时候我会得到以下的AttributeError,而且我不确定应该怎么做来修复错误。
#!/usr/bin/python
# encoding: utf-8
import CoreLocation
manager = CoreLocation.CLLocationManager.alloc().init()
manager.delegate()
manager.startUpdatingLocation()
coord = manager.location().coordinate()
lat, lon = coord.latitude, coord.longitude
print lat, lon
以下错误:
Traceback (most recent call last):
File "Desktop/SimpleCoreServices.py", line 11, in <module>
coord = manager.location().coordinate()
AttributeError: 'NoneType' object has no attribute 'coordinate'
Apple's developer documentation并没有帮助我,因为我的Objective-C并不强大。
答案 0 :(得分:0)
您应等待locationd
提示您进行位置访问。然后允许python使用位置服务。我在您的代码中添加了一个等待块:
import CoreLocation
from time import sleep
manager = CoreLocation.CLLocationManager.alloc().init()
manager.delegate()
manager.startUpdatingLocation()
while CoreLocation.CLLocationManager.authorizationStatus() != 3 or manager.location() is None:
sleep(.1)
coord = manager.location().coordinate()
lat, lon = coord.latitude, coord.longitude
print (lat, lon)
在循环等待authorizationStatus
并在location
中获取值时,将显示提示。有时大约需要30秒才能显示该对话框:
如果用户通过选择“允许”接受访问,则authorizationStatus
的值将变为3。此后,循环将继续等待,直到获得位置值为止。
不幸的是,有时无法通过“系统偏好设置”中的“安全性和隐私”部分控制访问。由于“定位服务”列表中的python行消失了,因此无法选中或取消选中它。另外,tccutil
shell命令无法控制它。
如果您不小心选择了“不允许”按钮,则可以使用these说明进行重置。