Opened 12 years ago
Closed 10 years ago
#38666 closed defect (fixed)
Unable to successfully import lightblue after installation
Reported by: | eroninjapan@… | Owned by: | macports-tickets@… |
---|---|---|---|
Priority: | Normal | Milestone: | |
Component: | ports | Version: | 2.1.3 |
Keywords: | Cc: | gstein@…, kurthindenburg (Kurt Hindenburg) | |
Port: | py-lightblue |
Description (last modified by ryandesign (Ryan Carsten Schmidt))
I'm running OSX 10.8.3 and have included the error message as well as steps to reproduce below.
sudo port selfupdate sudo port install py27-lightblue $ python Python 2.7.2 (default, Oct 11 2012, 20:14:37) [GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import lightblue Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/lightblue/__init__.py", line 160, in <module> from _lightblue import * File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/lightblue/_lightblue.py", line 398, in <module> class _AsyncDeviceInquiry(Foundation.NSObject): TypeError: Error when calling the metaclass bases class _AsyncDeviceInquiry does not fully implement protocol IOBluetoothDeviceInquiryDelegate: no implementation for deviceInquiryDeviceNameUpdated:device:devicesRemaining:
Change History (12)
comment:1 Changed 12 years ago by cooljeanius (Eric Gallager)
comment:2 Changed 12 years ago by eroninjapan@…
I ran the commands and the output is below. I'm now using MacPort's Python27 but unfortunately I still encounter the same error when attempting the import.
$ which python /usr/bin/python $ sudo port select python python27 Selecting 'python27' for 'python' succeeded. 'python27' is now active. $ which python /opt/local/bin/python $ python Python 2.7.3 (default, Nov 17 2012, 19:54:34) [GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin Type "help", "copyright", "credits" or "license" for more information. import lightblue Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/lightblue/__init__.py", line 160, in <module> from _lightblue import * File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/lightblue/_lightblue.py", line 398, in <module> class _AsyncDeviceInquiry(Foundation.NSObject): TypeError: Error when calling the metaclass bases class _AsyncDeviceInquiry does not fully implement protocol IOBluetoothDeviceInquiryDelegate: no implementation for deviceInquiryDeviceNameUpdated:device:devicesRemaining:
comment:3 Changed 12 years ago by ryandesign (Ryan Carsten Schmidt)
Description: | modified (diff) |
---|
comment:4 Changed 12 years ago by mf2k (Frank Schima)
Owner: | changed from macports-tickets@… to michael.klein@… |
---|
In the future, please Cc the port maintainer(s).
comment:6 follow-up: 7 Changed 12 years ago by sujitkrao@…
I'm having the same problem on 10.7.5, and looked a bit through the LightBlue source. The Python class _AsyncDeviceInquiry is a wrapper around the Objective-C class IOBluetoothDeviceInquiry and protocol IOBluetoothDeviceInquiryDelegate. It implements some, but not all, of the methods of IOBluetoothDeviceInquiryDelegate, and has a member variable instance IOBluetoothDeviceInquiry that it passes itself to on initialization. Before 10.7, IOBluetoothDeviceInquiryDelegate was an informal protocol, so all of the methods were optional. In 10.7 and later, IOBluetoothDeviceInquiryDelegate is a formal protocol with all of its methods explicitly declared optional, and it like PyObjC doesn't handle the optional methods correctly and throws an exception when not everything is implemented. I added the missing methods to _AsyncDeviceInquiry with empty implementations and it seemed to work:
def deviceInquiryDeviceNameUpdated_device_devicesRemaining_(self, sender, device, devicesRemaining): pass def deviceInquiryUpdatingDeviceNamesStarted_devicesRemaining_(self, sender, devicesRemaining): pass
This is my first time messing with Objective-C and PyObjC, so the problem might actually be different, but I was able to import LightBlue after I added the methods. I haven't tested anything else.
comment:7 Changed 11 years ago by gstein@…
Replying to sujitkrao@…:
...
def deviceInquiryDeviceNameUpdated_device_devicesRemaining_(self, sender, device, devicesRemaining): pass def deviceInquiryUpdatingDeviceNamesStarted_devicesRemaining_(self, sender, devicesRemaining): pass
I can confirm this patch is correct, and should be applied.
You'll note that "everybody" is applying a similar patch, when you look at the downstream network of postskolkovo/lightblue-0.4 at https://github.com/postskolkovo/lightblue-0.4/network
comment:9 Changed 11 years ago by mf2k (Frank Schima)
If someone will spend the time to submit a proper patch, then maybe this will get committed.
comment:10 Changed 11 years ago by mf2k (Frank Schima)
Owner: | changed from michael.klein@… to macports-tickets@… |
---|---|
Port: | py-lightblue added; py27-lightblue removed |
Michael is no longer maintaining this port. See r118707.
comment:12 Changed 10 years ago by kurthindenburg (Kurt Hindenburg)
Resolution: | → fixed |
---|---|
Status: | new → closed |
fixed in r124057 - still doesn't work for me but that's a different error
What does
which python
return for you? By the version number it looks like you're using the system one. If that's the case, you might want to try doingsudo port select python python27
so that MacPorts's python27 is your default python.