Source code: https://github.com/juju/python-libjuju
Bug reports: https://github.com/juju/python-libjuju/issues
Documentation: https://pythonlibjuju.readthedocs.io/en/latest/
- Python 3.5+
- Juju 2.0+
- Asynchronous - uses asyncio and async/await features of python 3.5
- Websocket-level bindings are programmatically generated (indirectly) from the Juju golang code, ensuring full api coverage
- Provides an OO layer which encapsulates much of the websocket api and provides familiar nouns and verbs (e.g. Model.deploy(), Application.add_unit(), etc.)
pip3 install jujuHere's a simple example that shows basic usage of the library. The example connects to the currently active Juju model, deploys a single unit of the ubuntu charm, then exits:
#!/usr/bin/python3
import logging
import sys
from juju import loop
from juju.model import Model
async def deploy():
    # Create a Model instance. We need to connect our Model to a Juju api
    # server before we can use it.
    model = Model()
    # Connect to the currently active Juju model
    await model.connect_current()
    try:
        # Deploy a single unit of the ubuntu charm, using the latest revision
        # from the stable channel of the Charm Store.
        ubuntu_app = await model.deploy(
          'ubuntu',
          application_name='ubuntu',
          series='xenial',
          channel='stable',
        )
        if '--wait' in sys.argv:
            # optionally block until the application is ready
            await model.block_until(lambda: ubuntu_app.status == 'active')
    finally:
        # Disconnect from the api server and cleanup.
        await model.disconnect()
def main():
    logging.basicConfig(level=logging.INFO)
    # If you want to see everything sent over the wire, set this to DEBUG.
    ws_logger = logging.getLogger('websockets.protocol')
    ws_logger.setLevel(logging.INFO)
    # Run the deploy coroutine in an asyncio event loop, using a helper
    # that abstracts loop creation and teardown.
    loop.run(deploy())
if __name__ == '__main__':
    main()More examples can be found in the docs, as well as in the examples/
directory of the source tree which can be run using tox.  For
example, to run examples/connect_current_model.py, use:
tox -e example -- examples/connect_current_model.py