echion


Nameechion JSON
Version 0.2.0 PyPI version JSON
download
home_page
SummaryIn-process CPython frame stack sampler
upload_time2023-10-14 16:25:56
maintainer
docs_urlNone
authorGabriele N. Tornetta
requires_python>=3.8
license
keywords performance profiling testing development
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <p align="center">
  <img align="center" src="art/logo.png" height="320px" />
</p>

<h1 align="center">Echion</h1>

<p align="center">
Near-zero-overhead, in-process CPython frame stack sampler with async support
</p>


## Synopsis

Echion is an in-process CPython frame stack sampler. It can achieve
near-zero-overhead, similar to [Austin][austin], by sampling the frame stack of
each thread without holding the GIL. Native stacks can be sampled too, but the
overhead is higher.

Echion is also the first example of a high-performance sampling async profiler
for CPython.


## Installation

Currently Echion is available to install from PyPI with

```console
pip install echion
```

Alternativey, if a wheel is not available for your combination of platform and
architecture, it can be installed from sources with

```console
pip install git+https://github.com/p403n1x87/echion
```

Compilation requires a C++ compiler and static versions of the `libunwind` and
`lzma` libraries.


## Usage

The following is the output of the `echion --help` command.

```
usage: echion [-h] [-i INTERVAL] [-c] [-n] [-o OUTPUT] [-s] [-w] [-v] [-V] ...

In-process CPython frame stack sampler

positional arguments:
  command               Command string to execute.

options:
  -h, --help            show this help message and exit
  -i INTERVAL, --interval INTERVAL
                        sampling interval in microseconds
  -c, --cpu             sample on-CPU stacks only
  -x EXPOSURE, --exposure EXPOSURE
                        exposure time, in seconds
  -n, --native          sample native stacks
  -o OUTPUT, --output OUTPUT
                        output location (can use %(pid) to insert the process ID)
  -p PID, --pid PID     Attach to the process with the given PID
  -s, --stealth         stealth mode (sampler thread is not accounted for)
  -w WHERE, --where WHERE
                        where mode: display thread stacks of the given process
  -v, --verbose         verbose logging
  -V, --version         show program's version number and exit
```
The output is written to a file specified with the `--output` option. Curretly, this is in
the format of the normal [Austin][austin] format, that is collapsed stacks with
metadata at the top. This makes it easy to re-use existing visualisation tools,
like the [Austin VS Code][austin-vscode] extension.


## Compatibility

Supported platforms: Linux (amd64, i686), Darwin (amd64, aarch64)

Supported interpreters: CPython 3.8-3.11

### Notes

Attaching to a process (including in where mode) requires extra permissions. On
Unix, you can attach to a running process with `sudo`. On Linux, one may also
set the ptrace scope to `0` with `sudo sysctl kernel.yama.ptrace_scope=0` to
allow attaching to any process. However, this is not recommended for security
reasons.


## Where mode

The where mode is similar to [Austin][austin]'s where mode, that is Echion will
dump the stacks of all running threads to standard error. This is useful for
debugging deadlocks and other issues that may occur in a running process.

When running or attaching to a process, you can also send a `SIGQUIT` signal to
dump the stacks of all running threads. The result is similar to the where mode.
You can normally send a `SIGQUIT` signal with the <kbd>CTRL</kbd>+<kbd>\\</kbd>
key combination.


## Why Echion?

Sampling in-process comes with some benefits. One has easier access to more
information, like thread names, and potentially the task abstraction of async
frameworks, like `asyncio`, `gevent`, ... . Also available is more accurate
per-thread CPU timing information.

Currently, Echion supports sampling asyncio-based applications, but not in
native mode. This makes Echion the very first example of an async profiler for
CPython.

Echion relies on some assumptions to collect and sample all the running threads
without holding the GIL. This makes Echion very similar to tools like
[Austin][austin]. However, some features, like multiprocess support, are more
complicated to handle and would require the use of e.g. IPC solutions.
Furthermore, Echion normally requires that you install it within your
environment, wheareas [Austin][austin] can be installed indepdendently.


## How it works

On a fundamental level, there is one key assumption that Echion relies upon:

> The interpreter state object lives as long as the CPython process itself.

All unsafe memory reads are performed indirectly via copies of data structure
obtained with the use of system calls like `process_vm_readv`. This is
essentially what allows Echion to run its sampling thread without the GIL.

As for attaching to a running process, we make use of the [hypno][hypno] library
to inject Python code that bootstraps Echion into the target process.


[austin]: http://github.com/p403n1x87/austin
[austin-vscode]: https://marketplace.visualstudio.com/items?itemName=p403n1x87.austin-vscode
[hypno]: https://github.com/kmaork/hypno

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "echion",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "",
    "keywords": "performance,profiling,testing,development",
    "author": "Gabriele N. Tornetta",
    "author_email": "\"Gabriele N. Tornetta\" <phoenix1987@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/4a/7a/8e9b0856efbe2d8ec8fb86fe48957902c79b5152a7269078b557f632c01c/echion-0.2.0.tar.gz",
    "platform": null,
    "description": "<p align=\"center\">\n  <img align=\"center\" src=\"art/logo.png\" height=\"320px\" />\n</p>\n\n<h1 align=\"center\">Echion</h1>\n\n<p align=\"center\">\nNear-zero-overhead, in-process CPython frame stack sampler with async support\n</p>\n\n\n## Synopsis\n\nEchion is an in-process CPython frame stack sampler. It can achieve\nnear-zero-overhead, similar to [Austin][austin], by sampling the frame stack of\neach thread without holding the GIL. Native stacks can be sampled too, but the\noverhead is higher.\n\nEchion is also the first example of a high-performance sampling async profiler\nfor CPython.\n\n\n## Installation\n\nCurrently Echion is available to install from PyPI with\n\n```console\npip install echion\n```\n\nAlternativey, if a wheel is not available for your combination of platform and\narchitecture, it can be installed from sources with\n\n```console\npip install git+https://github.com/p403n1x87/echion\n```\n\nCompilation requires a C++ compiler and static versions of the `libunwind` and\n`lzma` libraries.\n\n\n## Usage\n\nThe following is the output of the `echion --help` command.\n\n```\nusage: echion [-h] [-i INTERVAL] [-c] [-n] [-o OUTPUT] [-s] [-w] [-v] [-V] ...\n\nIn-process CPython frame stack sampler\n\npositional arguments:\n  command               Command string to execute.\n\noptions:\n  -h, --help            show this help message and exit\n  -i INTERVAL, --interval INTERVAL\n                        sampling interval in microseconds\n  -c, --cpu             sample on-CPU stacks only\n  -x EXPOSURE, --exposure EXPOSURE\n                        exposure time, in seconds\n  -n, --native          sample native stacks\n  -o OUTPUT, --output OUTPUT\n                        output location (can use %(pid) to insert the process ID)\n  -p PID, --pid PID     Attach to the process with the given PID\n  -s, --stealth         stealth mode (sampler thread is not accounted for)\n  -w WHERE, --where WHERE\n                        where mode: display thread stacks of the given process\n  -v, --verbose         verbose logging\n  -V, --version         show program's version number and exit\n```\nThe output is written to a file specified with the `--output` option. Curretly, this is in\nthe format of the normal [Austin][austin] format, that is collapsed stacks with\nmetadata at the top. This makes it easy to re-use existing visualisation tools,\nlike the [Austin VS Code][austin-vscode] extension.\n\n\n## Compatibility\n\nSupported platforms: Linux (amd64, i686), Darwin (amd64, aarch64)\n\nSupported interpreters: CPython 3.8-3.11\n\n### Notes\n\nAttaching to a process (including in where mode) requires extra permissions. On\nUnix, you can attach to a running process with `sudo`. On Linux, one may also\nset the ptrace scope to `0` with `sudo sysctl kernel.yama.ptrace_scope=0` to\nallow attaching to any process. However, this is not recommended for security\nreasons.\n\n\n## Where mode\n\nThe where mode is similar to [Austin][austin]'s where mode, that is Echion will\ndump the stacks of all running threads to standard error. This is useful for\ndebugging deadlocks and other issues that may occur in a running process.\n\nWhen running or attaching to a process, you can also send a `SIGQUIT` signal to\ndump the stacks of all running threads. The result is similar to the where mode.\nYou can normally send a `SIGQUIT` signal with the <kbd>CTRL</kbd>+<kbd>\\\\</kbd>\nkey combination.\n\n\n## Why Echion?\n\nSampling in-process comes with some benefits. One has easier access to more\ninformation, like thread names, and potentially the task abstraction of async\nframeworks, like `asyncio`, `gevent`, ... . Also available is more accurate\nper-thread CPU timing information.\n\nCurrently, Echion supports sampling asyncio-based applications, but not in\nnative mode. This makes Echion the very first example of an async profiler for\nCPython.\n\nEchion relies on some assumptions to collect and sample all the running threads\nwithout holding the GIL. This makes Echion very similar to tools like\n[Austin][austin]. However, some features, like multiprocess support, are more\ncomplicated to handle and would require the use of e.g. IPC solutions.\nFurthermore, Echion normally requires that you install it within your\nenvironment, wheareas [Austin][austin] can be installed indepdendently.\n\n\n## How it works\n\nOn a fundamental level, there is one key assumption that Echion relies upon:\n\n> The interpreter state object lives as long as the CPython process itself.\n\nAll unsafe memory reads are performed indirectly via copies of data structure\nobtained with the use of system calls like `process_vm_readv`. This is\nessentially what allows Echion to run its sampling thread without the GIL.\n\nAs for attaching to a running process, we make use of the [hypno][hypno] library\nto inject Python code that bootstraps Echion into the target process.\n\n\n[austin]: http://github.com/p403n1x87/austin\n[austin-vscode]: https://marketplace.visualstudio.com/items?itemName=p403n1x87.austin-vscode\n[hypno]: https://github.com/kmaork/hypno\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "In-process CPython frame stack sampler",
    "version": "0.2.0",
    "project_urls": {
        "homepage": "https://github.com/P403n1x87/echion",
        "issues": "https://github.com/P403n1x87/echion/issues",
        "repository": "https://github.com/P403n1x87/echion"
    },
    "split_keywords": [
        "performance",
        "profiling",
        "testing",
        "development"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b88ba604d105ec989fbd3945fb98f0fad76eb0320f69ae63c4cb7b3051c3f630",
                "md5": "eed1814f120f7988299df967ecb8fff7",
                "sha256": "2cc0831b0c473496dca2a0f3e3c201406238d9908e4bb045eb50ec8388d4a62e"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp310-cp310-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "eed1814f120f7988299df967ecb8fff7",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 123547,
            "upload_time": "2023-10-14T16:25:18",
            "upload_time_iso_8601": "2023-10-14T16:25:18.006189Z",
            "url": "https://files.pythonhosted.org/packages/b8/8b/a604d105ec989fbd3945fb98f0fad76eb0320f69ae63c4cb7b3051c3f630/echion-0.2.0-cp310-cp310-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1e5a097c4aaa9faa5fa2f5f2bd74a02982966ef80e9cd521b1d2c64e4067fd75",
                "md5": "3aaae9093c6a13d89eda6ce0e5857a51",
                "sha256": "9902ea4dc00bb8da3b6361983434115d7ab1b561812be312456b97191c5b8b04"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3aaae9093c6a13d89eda6ce0e5857a51",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 82200,
            "upload_time": "2023-10-14T16:25:20",
            "upload_time_iso_8601": "2023-10-14T16:25:20.173628Z",
            "url": "https://files.pythonhosted.org/packages/1e/5a/097c4aaa9faa5fa2f5f2bd74a02982966ef80e9cd521b1d2c64e4067fd75/echion-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b25517dc2b423b1ac943d64f52ad0ec79a1f87f70379f7936d24a96b30663f2d",
                "md5": "a377b4fa4eea4f8498096980f66ec49d",
                "sha256": "c2d429137f7d24c0ddf3ff482b878b878d54be69cbe8d3c792faa62e1f0618a2"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "a377b4fa4eea4f8498096980f66ec49d",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 77572,
            "upload_time": "2023-10-14T16:25:21",
            "upload_time_iso_8601": "2023-10-14T16:25:21.932131Z",
            "url": "https://files.pythonhosted.org/packages/b2/55/17dc2b423b1ac943d64f52ad0ec79a1f87f70379f7936d24a96b30663f2d/echion-0.2.0-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "631cf331c6cec268e0e150a901206ccc59460e445f569d2e7b208205c3d8b19e",
                "md5": "c85c746162028c4a2c9d3a3e95ff977c",
                "sha256": "5099a381e3ce1767b658b969cbd89b030dfbf72d13b52edb867baa413ca9b035"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "c85c746162028c4a2c9d3a3e95ff977c",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 731911,
            "upload_time": "2023-10-14T16:25:23",
            "upload_time_iso_8601": "2023-10-14T16:25:23.167106Z",
            "url": "https://files.pythonhosted.org/packages/63/1c/f331c6cec268e0e150a901206ccc59460e445f569d2e7b208205c3d8b19e/echion-0.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b8529030a63dcffef9cea17cc8a2c445b2d1376eff6b90c26aa6b171c7193be9",
                "md5": "2c10b28d7631abc61ca95dd7b930d995",
                "sha256": "87cb198d8e5199c7e93c93c6ade2f4bc06142727c9b7d785dec75f5fc3af3e19"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "2c10b28d7631abc61ca95dd7b930d995",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 745348,
            "upload_time": "2023-10-14T16:25:24",
            "upload_time_iso_8601": "2023-10-14T16:25:24.820994Z",
            "url": "https://files.pythonhosted.org/packages/b8/52/9030a63dcffef9cea17cc8a2c445b2d1376eff6b90c26aa6b171c7193be9/echion-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "12b5ea3b3a32094d52023898d0a7ea2d3fa9809c7b1d9defa9cb8e70090ab240",
                "md5": "c9d98358214dea2f566d6f532c967230",
                "sha256": "bc09c6da72874b53c3e312fb0b927760dcfb806feba7ee0cbd943aacc44f0c46"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c9d98358214dea2f566d6f532c967230",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 1297824,
            "upload_time": "2023-10-14T16:25:26",
            "upload_time_iso_8601": "2023-10-14T16:25:26.743506Z",
            "url": "https://files.pythonhosted.org/packages/12/b5/ea3b3a32094d52023898d0a7ea2d3fa9809c7b1d9defa9cb8e70090ab240/echion-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6a29b86f4883b184a083a1386abf8b20c0cf1b25006303b0492af433cad900ad",
                "md5": "f27a5e579216781bb9add39f8363db89",
                "sha256": "c7d15da9aeb40eaab1c340ba0de3856a86607dbd0e16a94001f1f2f3f8894248"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp311-cp311-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "f27a5e579216781bb9add39f8363db89",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 124506,
            "upload_time": "2023-10-14T16:25:28",
            "upload_time_iso_8601": "2023-10-14T16:25:28.372275Z",
            "url": "https://files.pythonhosted.org/packages/6a/29/b86f4883b184a083a1386abf8b20c0cf1b25006303b0492af433cad900ad/echion-0.2.0-cp311-cp311-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3c3efa82a30c7a6930981abeea9150338257a445e3120a4bd5ead06ca0bae617",
                "md5": "37d6d709ba460ea65695f1eff889bcd3",
                "sha256": "87efc5671c08f817704477d1cffe5ee8e0626bb646c0cb9568cf74d8d1ea12d8"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "37d6d709ba460ea65695f1eff889bcd3",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 82679,
            "upload_time": "2023-10-14T16:25:29",
            "upload_time_iso_8601": "2023-10-14T16:25:29.708133Z",
            "url": "https://files.pythonhosted.org/packages/3c/3e/fa82a30c7a6930981abeea9150338257a445e3120a4bd5ead06ca0bae617/echion-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "304d5e2e334950766f84d1558e1d907803299ff711a80e391e39688c29c4e97f",
                "md5": "6f53aef26fa8dbb58879e6ed6b1dd342",
                "sha256": "9bc3e48e58b0937d003ffa62b81da982cfec42998ed44c00acb3823c4ab4f354"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "6f53aef26fa8dbb58879e6ed6b1dd342",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 77989,
            "upload_time": "2023-10-14T16:25:31",
            "upload_time_iso_8601": "2023-10-14T16:25:31.601613Z",
            "url": "https://files.pythonhosted.org/packages/30/4d/5e2e334950766f84d1558e1d907803299ff711a80e391e39688c29c4e97f/echion-0.2.0-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cbf15bfeb1df3062a5710a4bc087bded514741c768dfc57af4334a70d3dff2ca",
                "md5": "6b270313651f284026edcf7e225b57dd",
                "sha256": "8258c1eeb6203c11d0f97118a839f7103ae8b41a86a4511eef30b3020c9b41dc"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "6b270313651f284026edcf7e225b57dd",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 730356,
            "upload_time": "2023-10-14T16:25:33",
            "upload_time_iso_8601": "2023-10-14T16:25:33.567236Z",
            "url": "https://files.pythonhosted.org/packages/cb/f1/5bfeb1df3062a5710a4bc087bded514741c768dfc57af4334a70d3dff2ca/echion-0.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b4cc903d2baea8ccb7d9530b65733c5b718a95ecc0524e8613bf9031ebf0b21e",
                "md5": "fc6d9bbcbe3feb8a8a7e219d70c34fae",
                "sha256": "7ceedacc9fa59147262e01ed701ccf35e98273ddf5740276aa090fa115589bc0"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "fc6d9bbcbe3feb8a8a7e219d70c34fae",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 743005,
            "upload_time": "2023-10-14T16:25:35",
            "upload_time_iso_8601": "2023-10-14T16:25:35.317587Z",
            "url": "https://files.pythonhosted.org/packages/b4/cc/903d2baea8ccb7d9530b65733c5b718a95ecc0524e8613bf9031ebf0b21e/echion-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8353445c466452bc643d902c7dcf55dd818ce9f60b6cfa3cd315d6beb9010e32",
                "md5": "14af8f274768d7b98bd1de2df7ff4833",
                "sha256": "b318a76198b3f5924703ecec59c12d6862d89af15890e533b6aaadf3f3295e53"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp311-cp311-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "14af8f274768d7b98bd1de2df7ff4833",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 1300738,
            "upload_time": "2023-10-14T16:25:36",
            "upload_time_iso_8601": "2023-10-14T16:25:36.666774Z",
            "url": "https://files.pythonhosted.org/packages/83/53/445c466452bc643d902c7dcf55dd818ce9f60b6cfa3cd315d6beb9010e32/echion-0.2.0-cp311-cp311-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "075713a22cbe9fc62380a51d2d103dfda55402acc2dbd19463fc5a4aac86d5d0",
                "md5": "f989f6f89cc84da38a78ff775272d75c",
                "sha256": "035e898b457980fca245227b535f51ac637eecd1f3ca084d87c0446fc103185d"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp38-cp38-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "f989f6f89cc84da38a78ff775272d75c",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 123439,
            "upload_time": "2023-10-14T16:25:38",
            "upload_time_iso_8601": "2023-10-14T16:25:38.125770Z",
            "url": "https://files.pythonhosted.org/packages/07/57/13a22cbe9fc62380a51d2d103dfda55402acc2dbd19463fc5a4aac86d5d0/echion-0.2.0-cp38-cp38-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c5ddff0235ef39a02a03f1766a7c979f24313f1daf3fc8d18ad56e309dac2d3b",
                "md5": "0863834aba6ab402e06f2c5490486340",
                "sha256": "8212de3106cad34f28493630e58cb69d0dca83045ef480517de12aac4f880891"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0863834aba6ab402e06f2c5490486340",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 82161,
            "upload_time": "2023-10-14T16:25:39",
            "upload_time_iso_8601": "2023-10-14T16:25:39.592936Z",
            "url": "https://files.pythonhosted.org/packages/c5/dd/ff0235ef39a02a03f1766a7c979f24313f1daf3fc8d18ad56e309dac2d3b/echion-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "72765fc65193f51b7bcacd7f292e092998f35dae1c1d819412919a025c996650",
                "md5": "a715dc9f7a1e493f815187d73855f7c4",
                "sha256": "8644ff99d5a5f99ac17d99070c6fadd6dffb5f9094c440610c45ee901b9b89c5"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp38-cp38-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "a715dc9f7a1e493f815187d73855f7c4",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 77496,
            "upload_time": "2023-10-14T16:25:40",
            "upload_time_iso_8601": "2023-10-14T16:25:40.843685Z",
            "url": "https://files.pythonhosted.org/packages/72/76/5fc65193f51b7bcacd7f292e092998f35dae1c1d819412919a025c996650/echion-0.2.0-cp38-cp38-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "02d2c3fa87e83f56196b1703b12ba839cf6a7a1808b7baa469fc09f2fa5415db",
                "md5": "f5fb907e2a0479eda586795fbab04b31",
                "sha256": "a267350b52dca202afc873847f051f84830d44fc5f01cf306e9367de8ff00e09"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "f5fb907e2a0479eda586795fbab04b31",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 730818,
            "upload_time": "2023-10-14T16:25:42",
            "upload_time_iso_8601": "2023-10-14T16:25:42.622543Z",
            "url": "https://files.pythonhosted.org/packages/02/d2/c3fa87e83f56196b1703b12ba839cf6a7a1808b7baa469fc09f2fa5415db/echion-0.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "513897e2be494374501cc39d61d3828f8b67685ff9442c59e14f34e50e936069",
                "md5": "c807faa3799689e69764042dbf3b19ab",
                "sha256": "540e0f5b50bfa5de89234ffd26bec5e68a9c095dd177110bcffa0e04698070b7"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c807faa3799689e69764042dbf3b19ab",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 744309,
            "upload_time": "2023-10-14T16:25:44",
            "upload_time_iso_8601": "2023-10-14T16:25:44.411520Z",
            "url": "https://files.pythonhosted.org/packages/51/38/97e2be494374501cc39d61d3828f8b67685ff9442c59e14f34e50e936069/echion-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "99c95a8a78a1eca294de491baed30411f1e3ad38626ef27ce6af87618fd9113d",
                "md5": "348565a583d9bc667a7c9a67b5ae3038",
                "sha256": "5b35531dcd6cdb0bb9c8a9a2fe4a09fdc4e6776c7ef2f34093a1c91e633a1b30"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp38-cp38-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "348565a583d9bc667a7c9a67b5ae3038",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 1296780,
            "upload_time": "2023-10-14T16:25:45",
            "upload_time_iso_8601": "2023-10-14T16:25:45.724120Z",
            "url": "https://files.pythonhosted.org/packages/99/c9/5a8a78a1eca294de491baed30411f1e3ad38626ef27ce6af87618fd9113d/echion-0.2.0-cp38-cp38-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b16fc4605294f094ac9f812264be745b83c38510fc75588e5e4a297f0744cbad",
                "md5": "da55c299f6f5b6941efb873fb05e0927",
                "sha256": "eceb683022393b929308330763ce49e9d71497cb699769a6b0f62ae28dceb69b"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp39-cp39-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "da55c299f6f5b6941efb873fb05e0927",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 123453,
            "upload_time": "2023-10-14T16:25:47",
            "upload_time_iso_8601": "2023-10-14T16:25:47.677322Z",
            "url": "https://files.pythonhosted.org/packages/b1/6f/c4605294f094ac9f812264be745b83c38510fc75588e5e4a297f0744cbad/echion-0.2.0-cp39-cp39-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1d0a665cd5c36797d0bbd15d4b2c1d646f00d849d8cce47fd11b01457e3b313e",
                "md5": "bcae5e0ff46479250e43d611fad8fe12",
                "sha256": "b477d82a352b5967167a2e476ae5077c7f64486df9182fb13a751b3b6698687c"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "bcae5e0ff46479250e43d611fad8fe12",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 82157,
            "upload_time": "2023-10-14T16:25:49",
            "upload_time_iso_8601": "2023-10-14T16:25:49.279774Z",
            "url": "https://files.pythonhosted.org/packages/1d/0a/665cd5c36797d0bbd15d4b2c1d646f00d849d8cce47fd11b01457e3b313e/echion-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "720e904c4fb081401777178381c86cbba2623e44bac8fa57cbea4244fb09004c",
                "md5": "949303358e904ea8dcb15cb4584896ce",
                "sha256": "4329f09897285f16c25a97737143f3e0db6079e824d68e1b78e4a7655cf77aff"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "949303358e904ea8dcb15cb4584896ce",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 77511,
            "upload_time": "2023-10-14T16:25:50",
            "upload_time_iso_8601": "2023-10-14T16:25:50.692226Z",
            "url": "https://files.pythonhosted.org/packages/72/0e/904c4fb081401777178381c86cbba2623e44bac8fa57cbea4244fb09004c/echion-0.2.0-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a3d05cf9ae8fd7d07fcb198e113abbb0140f1483fd4734fbb5e7f68417fa5ebb",
                "md5": "954c142c63d01d037eb29023169e4b9d",
                "sha256": "5e51b01c9ca31ee9d04640b182f8a1a1dfc535036798499e5c7d19b1bf441122"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl",
            "has_sig": false,
            "md5_digest": "954c142c63d01d037eb29023169e4b9d",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 731044,
            "upload_time": "2023-10-14T16:25:51",
            "upload_time_iso_8601": "2023-10-14T16:25:51.963814Z",
            "url": "https://files.pythonhosted.org/packages/a3/d0/5cf9ae8fd7d07fcb198e113abbb0140f1483fd4734fbb5e7f68417fa5ebb/echion-0.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bc9c90665e558301a95d01f51ba9f98c95db9d4f1b78b87f934ed74003117b24",
                "md5": "6e799b1dbda829a4ea969e91a1fae59a",
                "sha256": "b4e3d0a749d39b8130863834266fcd2598e882dbc7a3f0e5ff80a788fe2c76a7"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "6e799b1dbda829a4ea969e91a1fae59a",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 744390,
            "upload_time": "2023-10-14T16:25:53",
            "upload_time_iso_8601": "2023-10-14T16:25:53.204475Z",
            "url": "https://files.pythonhosted.org/packages/bc/9c/90665e558301a95d01f51ba9f98c95db9d4f1b78b87f934ed74003117b24/echion-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a03c91463341aaaae8825581c412392b13d950a4ea01c5c92bdfc36fac7e3d9f",
                "md5": "fff192674f75fdd914d5314950c4e4cc",
                "sha256": "d91af6dca3132f9ef020ad5ca81edb1351ba137ccd821b2a013898fc767127fc"
            },
            "downloads": -1,
            "filename": "echion-0.2.0-cp39-cp39-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "fff192674f75fdd914d5314950c4e4cc",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 1296800,
            "upload_time": "2023-10-14T16:25:54",
            "upload_time_iso_8601": "2023-10-14T16:25:54.511464Z",
            "url": "https://files.pythonhosted.org/packages/a0/3c/91463341aaaae8825581c412392b13d950a4ea01c5c92bdfc36fac7e3d9f/echion-0.2.0-cp39-cp39-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4a7a8e9b0856efbe2d8ec8fb86fe48957902c79b5152a7269078b557f632c01c",
                "md5": "61e48eb9eac6fdb2fcf37025d49180af",
                "sha256": "eba317668a9baecb56e6f37b733cc1892c90c19abe2071e10a36203e4c47e1eb"
            },
            "downloads": -1,
            "filename": "echion-0.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "61e48eb9eac6fdb2fcf37025d49180af",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 705081,
            "upload_time": "2023-10-14T16:25:56",
            "upload_time_iso_8601": "2023-10-14T16:25:56.328159Z",
            "url": "https://files.pythonhosted.org/packages/4a/7a/8e9b0856efbe2d8ec8fb86fe48957902c79b5152a7269078b557f632c01c/echion-0.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-10-14 16:25:56",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "P403n1x87",
    "github_project": "echion",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "echion"
}
        
Elapsed time: 0.13555s