A bridge between an Objective C runtime environment and Python.
Project description
Rubicon-ObjC
Rubicon-ObjC is a bridge between Objective C and Python. It enables you to:
Use Python to instantiate objects defined in Objective C,
Use Python to invoke methods on objects defined in Objective C, and
Subclass and extend Objective C classes in Python.
It also includes wrappers of the some key data types from the Core Foundation framework (e.g., NSString).
Quickstart
Rubicon uses a combination of ctypes, plus Objective-C’s own reflection APIs, to enable Objective C objects to be referenced in a Python process.
To install Rubicon, use pip:
$ pip install rubicon-objc
Then, in a Python shell
>>> from ctypes import cdll
>>> from ctypes import util
>>> from rubicon.objc import ObjCClass, objc_method
# Use ctypes to import a framework into the Python process
>>> cdll.LoadLibrary(util.find_library('Foundation'))
# Wrap an Objective C class contained in the framework
>>> NSURL = ObjCClass("NSURL")
# Then instantiate the Objective C class, using the API
# that is exposed through Objective C. The Python method name
# is the concatenated version of the Objective C method descriptor,
# with colons replaced with underscores. So, the equivalent of
# [NSURL URLWithString:@"http://pybee.org"];
# would be:
>>> NSURL.URLWithString_("http://pybee.org/")
# To create a new Objective C class, define a Python class that
# has the methods you want to define, decorate it to indicate that it
# should be exposed to the Objective C runtime, and annotate it to
# describe the type of any arguments that aren't of type ``id``:
>>> class Handler(NSObject):
... @objc_method
... def initWithValue_(self, v: int):
... self.value = v
... return self
...
... @objc_method
... def pokeWithValue_(self, v: int) -> None:
... print ("Poking with", v)
... print ("Internal value is", self.value)
# Then use the class:
>>> my_handler = Handler.alloc().initWithValue_(42)
>>> my_handler.pokeWithValue_(37)
Testing
To run the Rubicon test suite:
1. Compile the Rubicon test library. A Makefile has been provided to make this easy. Type:
$ make
to compile it.
Put the Rubicon support library somewhere that it will be found by dynamic library discovery. This means:
Under OS X, put the tests/objc directory in your DYLD_LIBRARY_PATH
Under Linux, put the tests/objc directory in your LD_LIBRARY_PATH
Under Windows…. something :-)
Run the test suite:
$ python setup.py test
A tox configuration has also been provided; to run the tests across all supported platforms, run:
$ tox
Community
Rubicon is part of the BeeWare suite. You can talk to the community through:
The BeeWare Users Mailing list, for questions about how to use the BeeWare suite.
The BeeWare Developers Mailing list, for discussing the development of new features in the BeeWare suite, and ideas for new tools for the suite.
Contributing
If you experience problems with this backend, log them on GitHub. If you want to contribute code, please fork the code and submit a pull request.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for rubicon_objc-0.2.2-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 061618a6db0a535028112511b01092f497c5a490135344429953484c4472f231 |
|
MD5 | d3fdcb00a9e42e8fa0cb3bfcc77036f8 |
|
BLAKE2b-256 | 508e460ad76d1b80cec488346a2dacef4267d193c6c7c48a271ddf3a5ad75536 |