Python MQTT v5.0 async client

Overview

PyPI version Build Status codecov

gmqtt: Python async MQTT client implementation.

Installation

The latest stable version is available in the Python Package Index (PyPi) and can be installed using

pip3 install gmqtt

Usage

Getting Started

Here is a very simple example that subscribes to the broker TOPIC topic and prints out the resulting messages:

import asyncio
import os
import signal
import time

from gmqtt import Client as MQTTClient

# gmqtt also compatibility with uvloop  
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())


STOP = asyncio.Event()


def on_connect(client, flags, rc, properties):
    print('Connected')
    client.subscribe('TEST/#', qos=0)


def on_message(client, topic, payload, qos, properties):
    print('RECV MSG:', payload)


def on_disconnect(client, packet, exc=None):
    print('Disconnected')

def on_subscribe(client, mid, qos, properties):
    print('SUBSCRIBED')

def ask_exit(*args):
    STOP.set()

async def main(broker_host, token):
    client = MQTTClient("client-id")

    client.on_connect = on_connect
    client.on_message = on_message
    client.on_disconnect = on_disconnect
    client.on_subscribe = on_subscribe

    client.set_auth_credentials(token, None)
    await client.connect(broker_host)

    client.publish('TEST/TIME', str(time.time()), qos=1)

    await STOP.wait()
    await client.disconnect()


if __name__ == '__main__':
    loop = asyncio.get_event_loop()

    host = 'mqtt.flespi.io'
    token = os.environ.get('FLESPI_TOKEN')

    loop.add_signal_handler(signal.SIGINT, ask_exit)
    loop.add_signal_handler(signal.SIGTERM, ask_exit)

    loop.run_until_complete(main(host, token))

MQTT Version 5.0

gmqtt supports MQTT version 5.0 protocol

Version setup

Version 5.0 is used by default. If your broker does not support 5.0 protocol version and responds with proper CONNACK reason code, client will downgrade to 3.1 and reconnect automatically. Note, that some brokers just fail to parse the 5.0 format CONNECT packet, so first check manually if your broker handles this properly. You can also force version in connect method:

from gmqtt.mqtt.constants import MQTTv311
client = MQTTClient('clientid')
client.set_auth_credentials(token, None)
await client.connect(broker_host, 1883, keepalive=60, version=MQTTv311)

Properties

MQTT 5.0 protocol allows to include custom properties into packages, here is example of passing response topic property in published message:

TOPIC = 'testtopic/TOPIC'

def on_connect(client, flags, rc, properties):
    client.subscribe(TOPIC, qos=1)
    print('Connected')

def on_message(client, topic, payload, qos, properties):
    print('RECV MSG:', topic, payload.decode(), properties)

async def main(broker_host, token):
    client = MQTTClient('asdfghjk')
    client.on_message = on_message
    client.on_connect = on_connect
    client.set_auth_credentials(token, None)
    await client.connect(broker_host, 1883, keepalive=60)
    client.publish(TOPIC, 'Message payload', response_topic='RESPONSE/TOPIC')

    await STOP.wait()
    await client.disconnect()
Connect properties

Connect properties are passed to Client object as kwargs (later they are stored together with properties received from broker in client.properties field). See example below.

  • session_expiry_interval - int Session expiry interval in seconds. If the Session Expiry Interval is absent the value 0 is used. If it is set to 0, or is absent, the Session ends when the Network Connection is closed. If the Session Expiry Interval is 0xFFFFFFFF (max possible value), the Session does not expire.
  • receive_maximum - int The Client uses this value to limit the number of QoS 1 and QoS 2 publications that it is willing to process concurrently.
  • user_property - tuple(str, str) This property may be used to provide additional diagnostic or other information (key-value pairs).
  • maximum_packet_size - int The Client uses the Maximum Packet Size (in bytes) to inform the Server that it will not process packets exceeding this limit.

Example:

client = gmqtt.Client("lenkaklient", receive_maximum=24000, session_expiry_interval=60, user_property=('myid', '12345'))
Publish properties

This properties will be also sent in publish packet from broker, they will be passed to on_message callback.

  • message_expiry_interval - int If present, the value is the lifetime of the Application Message in seconds.
  • content_type - unicode UTF-8 Encoded String describing the content of the Application Message. The value of the Content Type is defined by the sending and receiving application.
  • user_property - tuple(str, str)
  • subscription_identifier - int (see subscribe properties) sent by broker
  • topic_alias - int First client publishes messages with topic string and kwarg topic_alias. After this initial message client can publish message with empty string topic and same topic_alias kwarg.

Example:

def on_message(client, topic, payload, qos, properties):
    # properties example here: {'content_type': ['json'], 'user_property': [('timestamp', '1524235334.881058')], 'message_expiry_interval': [60], 'subscription_identifier': [42, 64]}
    print('RECV MSG:', topic, payload, properties)

client.publish('TEST/TIME', str(time.time()), qos=1, retain=True, message_expiry_interval=60, content_type='json')
Subscribe properties
  • subscription_identifier - int If the Client specified a Subscription Identifier for any of the overlapping subscriptions the Server MUST send those Subscription Identifiers in the message which is published as the result of the subscriptions.

Reconnects

By default, connected MQTT client will always try to reconnect in case of lost connections. Number of reconnect attempts is unlimited. If you want to change this behaviour, do the following:

client = MQTTClient("client-id")
client.set_config({'reconnect_retries': 10, 'reconnect_delay': 60})

Code above will set number of reconnect attempts to 10 and delay between reconnect attempts to 1min (60s). By default reconnect_delay=6 and reconnect_retries=-1 which stands for infinity. Note that manually calling await client.disconnect() will set reconnect_retries for 0, which will stop auto reconnect.

Asynchronous on_message callback

You can define asynchronous on_message callback. Note that it must return valid PUBACK code (0 is success code, see full list in constants)

async def on_message(client, topic, payload, qos, properties):
    pass
    return 0

Other examples

Check examples directory for more use cases.

Comments
  • GMQTT with TLS: Not able to connect to broker #122

    GMQTT with TLS: Not able to connect to broker #122

    TLS option is not working as expected. I'm new to this so trying to generate the certificates through this link : https://www.engineersgarage.com/tutorials/secure-client-server-communication-over-tls-security-protocol-using-mosquitto-broker-iot-part-42/ and copied the mosquitto_client.crt and mosquitto_client.key in mosquitto folder.

    Configuration in my code, using gmqtt:

        sub_client = MQTTClient(client_id='test')
        ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
        ssl_context.load_cert_chain('D:\Project\kiwee_action\mosquitto\certs\mosquitto_client.crt',
                                    keyfile='D:\Project\kiwee_action\mosquitto\certs\mosquitto_client.key')
        self.assign_callbacks_to_client(sub_client)
        logging.info("connecting")
        await sub_client.connect(host=config.37c16a79d00a, port=8883, ssl=ssl_context)
        return sub_client
    

    Issue: No error, but it is not able to connect to broker, If I remove this ssl part then it is working I am able to connect and publish the messages.

    Am I generating the mosquitto cert wrongly? Do we have to add some other files to mosuqitto.conf file Taking reference from this : https://github.com/wialon/gmqtt/issues/77

    opened by nitinkothari17 15
  • Connection lost on Linux server

    Connection lost on Linux server

    Hi,

    I am getting connect/disconnect events all the time on my Linux (debian) server. The same script works ok on my local machine (mac). The pattern is always the same, like:

    CONNECTED->SUBSCRIBED->CONN CLOSE NORMALLY/DISONNECT after exactly 4 minutes->CONNECTED->CONN CLOSE NORMALLY/DISONNECT after exactly 2 minutes. Then it repeats every 2 minutes many times, then again 4 minutes/2 minutes.

    I don't find anything in my server logs and there is only "503: mqtt session connection was closed (Unexpected disconnect)" message logged on flespi platform.

    Any clue on what this could be? Probably some server/network related stuff but don't know how to identify it I am attaching the screenshot from my terminal.

    Thx on any help that could help me resolve this.

    regards, dejan Screenshot 2020-03-18 at 15 39 41

    opened by dgambin 12
  • Remove double check for keepalive

    Remove double check for keepalive

    (at least on MacOS) the call_later-target is executed some milliseconds before the set timeout and therefore the ping will not be sent in a valid time for the broker.

    Explanation: For example: if keepalive is set to 2 seconds timeout, the call will eventually be made after 1.91(+-) seconds. Thus, the first call comes in after 1.91 seconds and the comparison if time.monotonic() - self._last_data_in >= self._keepalive will evaluate to false. The second call will be made after 3.92 seconds - but its already too late to send the ping to the broker then, because the maximum tolerance on broker-side is 1.5 * keepalive.

    As the timeout for call_later is already equal to keepalive, we can simply remove the double check inside the _keep_connection to have everything worky.

    opened by Dirk007 7
  • Asynchronous handlers

    Asynchronous handlers

    Is there any plan to switch to asynchronous handlers?

    I'd like to use an asynchronous function to store messages to a database using asyncio:

    async def on_message(client, topic, payload, qos, properties):
        pass
    
    mqtt_client.on_message = on_message
    

    Indeed it is still possible to add a new task to the event loop; I just thought it would be nicer.

    opened by DurandA 7
  • Handler does not work for null body retained messages published before the handler created

    Handler does not work for null body retained messages published before the handler created

    Handler does not work for null body retained messages published before the handler created. One service publishes null body messages with retaining True. Another service started later and its handlers don't react only on null-body retained messages. With other kinds of messages, everything is ok and Handlers catch it successfully. Maybe I should add some specific parameters for that case?

    opened by freemansgit 6
  • Topic Alias support?

    Topic Alias support?

    First of all, congrats to the developers on this great project, gmqtt is a joy a to use. Thanks!

    I had a quick look and it seems that Topic Alias are not supported by gmqtt. Is that the case? I will happily send a PR improving the docs if they are already supported, just couldn't see how.

    opened by pablogamboa 6
  • Reference to asyncio in synchronous method gmqtt.client.Client.publish

    Reference to asyncio in synchronous method gmqtt.client.Client.publish

    There is a wrong line in the publish() method of the client:

    https://github.com/wialon/gmqtt/blob/c167583682b38590a9770b8120662295d81c9c16/gmqtt/client.py#L195

    which causes failures in my code:

    2019-06-06 10:26:48,687 [ERROR] connectors.printer_input: Traceback (most recent call last):
    ...
      File "/home/rkrell/work/project/site-packages/syncasync.py", line 120, in thread_handler
        return self.func(*args, **kwargs)
      File "/home/rkrell/work/project/site-packages/gmqtt/client.py", line 195, in publish
        loop = asyncio.get_event_loop()
      File "/home/rkrell/work/project/pypy3.5-7.0.0-linux_x86_64-portable/lib-python/3/asyncio/events.py", line 671, in get_event_loop
        return get_event_loop_policy().get_event_loop()
      File "/home/rkrell/work/project/pypy3.5-7.0.0-linux_x86_64-portable/lib-python/3/asyncio/events.py", line 583, in get_event_loop
        % threading.current_thread().name)
    RuntimeError: There is no current event loop in thread 'Thread-1'.
    
    

    Since this line has no effect it should be removed from this synchronous function.

    opened by rkrell 6
  • GMQTT with TLS: ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

    GMQTT with TLS: ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

    TLS option is not working as expected. I can only set ssl to True but I cannot provide a path to the cert file. Mosquitto configuration is working ok with TLS both publisher and subscriber:

    mosquitto_sub --cafile /etc/mosquitto/ca_certificates/ca.crt -h 37c16a79d00a -t 'test' -p 8883 -u report -P 'report'
    
    
    mosquitto_pub --cafile /etc/mosquitto/ca_certificates/ca.crt -h 37c16a79d00a -t 'test' -m 'amessage' -p 8883 -u report -P 'report'
    
    
    mosquitto -v -c /etc/mosquitto/mosquitto.conf
    
    1575295867: New client connected from 172.17.0.3 as mosq-W7nvl4LtsfAVItCtHT (p2, c1, k60, u'report').
    1575295867: Client mosq-W7nvl4LtsfAVItCtHT disconnected.
    1575295870: New connection from 172.17.0.3 on port 8883.
    

    If I try to apply same configuration for gmqtt I get the error on the title

    # EXAMPLE
    import asyncio
    
    from gmqtt import Client
    
    
    async def main():
        cli = Client(client_id='test',
                     will_message=None,
                     clean_session=True)
        cli.set_auth_credentials('report', password='report')
        await cli.connect(host='37c16a79d00a',
                          port=8883,
                          keepalive=True,
                          ssl=True)
    
    if __name__ == '__main__':
        loop = asyncio.get_event_loop()
        loop.run_until_complete(main())
    
    

    ERROR FILE

    gmqtt/mqtt/connection.py

    ERROR LINE

    transport, protocol = await loop.create_connection(MQTTProtocol, host, port, ssl=ssl)

    ERROR MESSAGE

    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1076)

    I would like to know how to implement TLS over gmqtt. Could you provide a quick example? Thanks

    opened by nicoCalvo 5
  • Use gmqtt without uvlo

    Use gmqtt without uvlo

    I just installed gmqtt but uvloop does not support Windows at the moment.

    Can I use gmqtt without uvloop?

    In the example, there is this comment: 'gmqtt also compatibility with uvloop' What does it mean? Is it a dependency or a choice?

    best regards

    opened by simonegiacomelli 5
  • Client does not reconnect

    Client does not reconnect

    Hi,

    I'm using version 0.5.6 and got the following code:

    #!/usr/bin/env python3
    
    import asyncio
    from gmqtt import Client as MQTTClient
    from gmqtt.mqtt.constants import UNLIMITED_RECONNECTS
    import logging
    
    logging.basicConfig(level=logging.DEBUG)
    
    async def main():
        mqtt = MQTTClient('tester')
    
        mqtt.set_config({
            'reconnect_retries': UNLIMITED_RECONNECTS,
            'reconnect_delay': 1
        })
    
        await mqtt.connect('localhost')
    
        while True:
            #if mqtt.is_connected:
            mqtt.publish('ohlc_1m', 'check')
            await asyncio.sleep(1)
    
    def handle_exception(loop, context):
        # context["message"] will always be there; but context["exception"] may not
        msg = context.get("exception", context["message"])
        logging.error(f"Caught exception: {str(msg)}")
    
    loop = asyncio.get_event_loop()
    loop.set_exception_handler(handle_exception)
    loop.run_until_complete(main())
    

    To test the reconnection I'm restarting mosquitto service and get the following output:

    DEBUG:asyncio:Using selector: EpollSelector
    INFO:gmqtt.mqtt.protocol:[CONNECTION MADE]
    DEBUG:gmqtt.mqtt.handler:[CMD 0x20] b'\x00\x00\x03"\x00\n'
    DEBUG:gmqtt.mqtt.handler:[CONNACK] flags: 0x0, result: 0x0
    DEBUG:gmqtt.client:[QoS query IS EMPTY]
    DEBUG:gmqtt.mqtt.package:Sending PUBLISH (q0), 'ohlc_1m', ... (5 bytes)
    DEBUG:gmqtt.mqtt.package:Sending PUBLISH (q0), 'ohlc_1m', ... (5 bytes)
    DEBUG:gmqtt.mqtt.protocol:[RECV EMPTY] Connection will be reset automatically.
    INFO:gmqtt.mqtt.protocol:[CONN CLOSE NORMALLY]
    DEBUG:gmqtt.mqtt.handler:[CMD 0xe0] b''
    DEBUG:gmqtt.mqtt.package:Sending PUBLISH (q0), 'ohlc_1m', ... (5 bytes)
    Traceback (most recent call last):
      File "test.py", line 32, in <module>
        loop.run_until_complete(main())
      File "/usr/lib/python3.8/asyncio/base_events.py", line 612, in run_until_complete
        return future.result()
      File "test.py", line 22, in main
        mqtt.publish('ohlc_1m', 'check')
      File "/usr/lib/python3.8/site-packages/gmqtt/client.py", line 228, in publish
        mid, package = self._connection.publish(message)
      File "/usr/lib/python3.8/site-packages/gmqtt/mqtt/connection.py", line 54, in publish
        return self._protocol.send_publish(message)
      File "/usr/lib/python3.8/site-packages/gmqtt/mqtt/protocol.py", line 111, in send_publish
        self.write_data(pkg)
      File "/usr/lib/python3.8/site-packages/gmqtt/mqtt/protocol.py", line 45, in write_data
        if not self._transport.is_closing():
    AttributeError: 'NoneType' object has no attribute 'is_closing'
    

    I've seen a similar error in #74 so reporting this one for further investigation.

    opened by naquad 4
  • restore subscriptions after connection lost

    restore subscriptions after connection lost

    Hi, I'm facing an issue when restoring subscriptions after a lost connection. I'm testing durability of connections and whenever I shut the connection down (turning the access point off) gmqtt reconnects and delivers messages but the subscriptions remain dead.

    I see two of the following log messages right after each other:

    INFO:mqtt.MQTTClient:MQTT connected
    INFO:gmqtt.mqtt.protocol:[CONN CLOSE NORMALLY]
    WARNING:gmqtt.mqtt.handler:[EXC OCCURED] in reconnect future None
    

    A little later:

    INFO:gmqtt.mqtt.protocol:[CONNECTION MADE]
    WARNING:gmqtt.mqtt.handler:[EXC OCCURED] in reconnect future None
    

    Any idea on how to either verify subscriptions and resubscribe in case a subscription is lost or how to make subscriptions more robust?

    opened by HerrMuellerluedenscheid 4
  • Newer example code

    Newer example code

    This PR provides a new revision of the sample code that has a few key features:

    • construct the gmqtt.Client() outside of the run loop
    • graceful shutdown of the client, and clearing of all tasks so that loop.close() does not throw errors
    • switch to .run_forever() instead of the singular gmqtt task, providing an example for other tasks to run in the same event loop
    • removal of the STOP event, in favor of the loop's built-in stopping mechanism
    opened by gstein 0
  • No PubBack Message

    No PubBack Message

    i have an application with google-iot-core Google iot-core allows you to have A gateway with multiple devices The gateway is the Client. To be able the multiples devices to communicate thought gateway with the google-broker its need to publish a specific attach message to google-iot-core broker, after that you can subscribe as device in the broker The problem is gmqtt doesnt return PubBack message when i publish the attach message so i dont know if the attach has been complete succesfull to continue with the logic

    opened by bambachas 0
  • publish() and then disconnect() may result in messages not received by a broker

    publish() and then disconnect() may result in messages not received by a broker

    Hi.

    We have such code (simplified): client = MQTTClient(instance_name, session_expiry_interval=0, clean_session=True) await client.connect(broker_addr) client.publish("theMessage", qos=1, retain=True) # we possibly send here much more messages await asyncio.sleep(4) # wait for publish msgs to be sent; 2 secs is not enough, 4 is enough (update: or not) await client.disconnect() sys.exit(0)

    problem is with the sleep; without the sleep, "theMessage" (and/or subsquently sent messsages) is not received by the broker. Recently, sleep with even 4 seconds is not enough. Is there a better way to wait for the queued messages to be received by the broker, before making a disconnect?

    opened by dawcal 0
  • I can't to use ca.crt, client.crt, client.key (X509 certificate) to connect mqtt broker.

    I can't to use ca.crt, client.crt, client.key (X509 certificate) to connect mqtt broker.

    Hi everyone

    I want to use ca.crt, client.crt, client.key to connect mqtt broker.

    My code like following:

        client = MQTTClient(clientId)
        print("Before ", client.is_connected)
        contextInstance = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
        contextInstance.load_default_certs()
        contextInstance.load_verify_locations(cafile=tls_CERT_PATH, cadata=None, capath=None)
        contextInstance.verify_mode =ssl.CERT_REQUIRED
        contextInstance.load_cert_chain(certfile=tls_CLIENT_PATH, keyfile=tls_CLIENTKEY_PATH)
        contextInstance.check_hostname=False
        result = await client.connect(host=broker,port=port,ssl=contextInstance)
        print("Result ", result)
        print("client.is_connected ", client.is_connected)
    

    And the execute result is:

    Before  False
    

    The execute is stop at the following line code

    result = await client.connect(host=broker,port=port,ssl=contextInstance)
    

    Can someone tell me how to fix it?

    Thanks for your watching and any idea.

    The X509 certificate file content is: ca.crt -> Just a ca certificate. Content as following

    -----BEGIN CERTIFICATE-----
    content message
    -----END CERTIFICATE-----
    

    client.crt -> Just a client certificate. Content as following

    -----BEGIN CERTIFICATE-----
    content message
    -----END CERTIFICATE-----
    

    client.key -> Just a client key. Content as following

    -----BEGIN PRIVATE KEY-----
    content message
    -----END PRIVATE KEY------
    opened by jamwu1991 1
  • Exceeded reconnect_retries seems seems not to be working

    Exceeded reconnect_retries seems seems not to be working

    I was looking for a way of checking if the reconnect_tries was exceeded and found this issue: https://github.com/wialon/gmqtt/issues/72 that was asking the same. It has a PR associated: https://github.com/wialon/gmqtt/pull/76

    The thing is I've tried the solution proposed with gmqtt==0.6.9 and on_disconnect is only called when the first disconnection happens...

    def on_disconnect(self, client: gmqtt.Client, packet: bytes, exc: None = None):
        if client.failed_connections > client.reconnect_retries:
        #    method that logs that the system couldn't reconnect...
    

    Thanks!

    opened by presedo93 1
  • [PROPERTIES] received invalid property id 105, disconnecting

    [PROPERTIES] received invalid property id 105, disconnecting

    I don't understand the code well enough to make sense of what I am seeing here, but I am sometimes getting exceptions thrown in MqttPackageHandler._handle_publish_packet() due to the returned value of properties from qttPackageHandler._parse_parameters() being None:

    [PROPERTIES] received invalid property id 105, disconnecting
    [ERROR HANDLE PKG]
    Traceback (most recent call last):
      File "/usr/local/lib/python3.7/dist-packages/gmqtt/mqtt/handler.py", line 389, in __call__
        result = self._handle_packet(cmd, packet)
      File "/usr/local/lib/python3.7/dist-packages/gmqtt/mqtt/handler.py", line 214, in _handle_packet
        handler(cmd, packet)
      File "/usr/local/lib/python3.7/dist-packages/gmqtt/mqtt/handler.py", line 326, in _handle_publish_packet
        properties['dup'] = dup
    TypeError: 'NoneType' object does not support item assignment
    2
    

    Looking at the code in _handle_connack_packet, a test is made for None and a call to self.disconnect() queued. But _handle_publish_packet() makes no such test, before assuming that properties is a Dict that can be assigned to.

    Should there be a test here leading to a disconnect (as elsewhere)? That the error message from _parse_parameters says "disconnecting" but then doesn't attempt to (depending on where it is called from) suggests this is a suitable fix but I don't know what the implications might be.

    opened by hollymcr 2
Releases(v0.6.11)
Owner
Gurtam
Gurtam
A server shell for you to play with Powered by Django + Nginx + Postgres + Bootstrap + Celery.

A server shell for you to play with Powered by Django + Nginx + Postgres + Bootstrap + Celery.

Mengting Song 1 Jan 10, 2022
Bitflip Fault Simulation Platform by Daniele Rizzieri (2021)

BFSP [v1.05] Bitflip Fault Simulation Platform by Daniele Rizzieri (2021) The platform injects a random bitflip in each of N copies of a binary file.

Daniele Rizzieri 2 Nov 05, 2022
Flask html response minifier

Flask-HTMLmin Minify flask text/html mime type responses. Just add MINIFY_HTML = True to your deployment config to minify HTML and text responses of y

Hamid Feizabadi 85 Dec 07, 2022
Tool for running a high throughput data ingestion/transformation workload with MongoDB

Mongo Mangler The mongo-mangler tool is a lightweight Python utility, which you can run from a low-powered machine to execute a high throughput data i

Paul Done 9 Jan 02, 2023
A lightweight and unlocked launcher for Lunar Client made in Python.

LCLPy LCL's Python Port of Lunar Client Lite. Releases: https://github.com/Aetopia/LCLPy/releases Build Install PyInstaller. pip install PyInstaller

21 Aug 03, 2022
A Tool to validate domestic New Zealand vaccine passes

Vaccine Validator Tool to validate domestic New Zealand vaccine passes Create a new virtual environment: python3 -m venv ./venv Activate virtual envi

8 May 01, 2022
This is the repo for Uncertainty Quantification 360 Toolkit.

UQ360 The Uncertainty Quantification 360 (UQ360) toolkit is an open-source Python package that provides a diverse set of algorithms to quantify uncert

International Business Machines 207 Dec 30, 2022
Python project that aims to discover CDP neighbors and map their Layer-2 topology within a shareable medium like Visio or Draw.io.

Python project that aims to discover CDP neighbors and map their Layer-2 topology within a shareable medium like Visio or Draw.io.

3 Feb 11, 2022
Simple tools to make/dump CPC+ CPR cartridge files

Simple tools to make/dump CPC+ CPR cartridge files mkcpr.py: make a CPR file from files (one chunk per file); see notes cprdump.py: dump the chunks of

Juan J. Martínez 3 May 30, 2022
Pre-crisis Risk Management for Personal Finance

Антикризисный риск-менеджмент личных финансов Риск-менеджмент личных финансов условиях санкций и/или финансового кризиса: делаем сегодня все, чтобы за

Dmitry Petukhov 593 Jan 09, 2023
A Dungeon and Dragons Toolkit using Python

Pythons-Dungeons A Dungeon and Dragons Toolkit using Python Rules: -When you are commiting please don't delete parts of the code that are important -A

2 Oct 21, 2021
XlvnsScriptTool - Tool for decompilation and compilation of scripts .SDT from the visual novel's engine xlvns

XlvnsScriptTool English Dual languaged (rus+eng) tool for decompiling and compiling (actually, this tool is more than just (dis)assenbler, but less th

Tester 3 Sep 15, 2022
A tool for removing PUPs using signatures

Unwanted program removal tool A tool for removing PUPs using signatures What is the unwanted program removal tool? The unwanted program removal tool i

4 Sep 20, 2022
IST-Website - IST Tutoring Portal for python

IST Tutoring Portal This portal is a web based interface to handle student help

Jean 3 Jan 03, 2022
Python Repository for Bachelor Ski Sign.

BachelorSkiSign Python Repository for Bachelor Ski Sign. This application reads data from https://bachelorapi.azurewebsites.net/ It is written in Ciru

Winston 1 Jan 04, 2022
Python script to automate the change of desktop background

wallomator Python script to automate the change of desktop background A python script that automates the process of changing the desktop background. I

Mohammed Haaris Javed 10 Jun 16, 2022
Identify unused production dependencies and avoid a bloated virtual environment.

creosote Identify unused production dependencies and avoid a bloated virtual environment. Quickstart # Install creosote in separate virtual environmen

Fredrik Averpil 7 Dec 29, 2022
Really bad lisp implementation. Fun with pattern matching.

Lisp-py This is a horrible, ugly interpreter for a trivial lisp. Don't use it. It was written as an excuse to mess around with the new pattern matchin

Erik Derohanian 1 Nov 23, 2021
OpenTracing API for Python

OpenTracing API for Python This library is a Python platform API for OpenTracing. Required Reading In order to understand the Python platform API, one

OpenTracing API 767 Dec 16, 2022
Ballcone is a fast and lightweight server-side Web analytics solution.

Ballcone Ballcone is a fast and lightweight server-side Web analytics solution. It requires no JavaScript on your website. Screenshots Design Goals Si

Dmitry Ustalov 49 Dec 11, 2022