{ "info": { "author": "Max Fischer", "author_email": "maxfischer2781@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Interpreters", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": ".. # - # Copyright 2016 Max Fischer\n.. # - #\n.. # - # Licensed under the Apache License, Version 2.0 (the \"License\");\n.. # - # you may not use this file except in compliance with the License.\n.. # - # You may obtain a copy of the License at\n.. # - #\n.. # - # http://www.apache.org/licenses/LICENSE-2.0\n.. # - #\n.. # - # Unless required by applicable law or agreed to in writing, software\n.. # - # distributed under the License is distributed on an \"AS IS\" BASIS,\n.. # - # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n.. # - # See the License for the specific language governing permissions and\n.. # - # limitations under the License.\n\n++++++\nCPy2Py\n++++++\n\n|pypi| |landscape| |travis| |codecov|\n\nMulti-intepreter execution environment\n\n`cpy2py` allows multiple interpreters to act as one application. In parallel\nto the main interpreter, other interpreters are run to execute parts of\nthe application.\n\n.. |landscape| image:: https://landscape.io/github/maxfischer2781/cpy2py/master/landscape.svg?style=flat\n :target: https://landscape.io/github/maxfischer2781/cpy2py/master\n :alt: Code Health\n\n.. |travis| image:: https://travis-ci.org/maxfischer2781/cpy2py.svg?branch=master\n :target: https://travis-ci.org/maxfischer2781/cpy2py\n :alt: Test Health\n\n.. |pypi| image:: https://img.shields.io/pypi/v/cpy2py.svg\n :target: https://pypi.python.org/pypi/cpy2py\n :alt: PyPI Package\n\n.. |codecov| image:: https://codecov.io/gh/maxfischer2781/cpy2py/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/maxfischer2781/cpy2py\n :alt: Code Coverage\n\n.. contents:: **Table of Contents**\n :depth: 2\n\nQuick Guide\n===========\n\nTwinterpreters and TwinMasters\n------------------------------\n\nA twinterpreter is simply another interpreter running as a subprocess -\nwith some glue and magic sprinkled on it. You can control and create them\nusing a `cpy2py.TwinMaster`.\n\nYou should only ever worry about two methods: `TwinMaster.start`\nlaunches the twinterpreter. `TwinMaster.execute` executes\nan arbitrary callable in the twinterpreter.\n\n.. code:: python\n\n from cpy2py import TwinMaster\n from my_module import my_function\n twinterpreter = TwinMaster('pypy')\n twinterpreter.start()\n\n if __name__ == \"__main__\":\n twinterpreter.execute(my_function, 1, 2, 3, 'ka-pow!', doctor=\"who?\")\n\nTwinObjects\n-----------\n\nThe real power of `cpy2py` are Twins - objects living in one\ntwinterpreter and being represented by proxies in any other interpeter.\nUsing twins, you can seamlessly split your application across multiple\ntwinterpreters.\n\nYou create twins by inheriting from\n`cpy2py.TwinObject` instead of `object` and\nsetting a ``__twin_id__``. That's it.\n\n.. code:: python\n\n from cpy2py import TwinObject\n class SuperComputer(TwinObject):\n __twin_id__ = 'pypy' # makes class native to pypy twinterpeter\n\n def megaloop(self, x, y):\n return sum(a+b for a in range(x) for b in range(y))\n\n class CWrapper(TwinObject):\n __twin_id__ = 'python' # makes class native to python twinterpeter\n\n def callme(self, who, what=\"buy milk\"):\n return some_clib.c_fcn_cll_cplx_xmpl(who, what)\n\nIf you don't set ``__twin_id__`` on a child of\n`cpy2py.TwinObject`,\nthe class will always be native to the main interpreter. Handy for all\nthe stuff that's needed everywhere but really doesn't belong anywhere.\n\n:note: At the moment, you have to explicitly start a class's native\n twinterpreter before instantiating the class. Only the main\n interpreter is always available, of course.\n\nTwinFunctions\n-------------\n\nInstead of full-fletched objects, you can also define functions as twins.\nThese are automatically called in their native twinterpreter.\n\n.. code:: python\n\n from cpy2py import twinfunction\n\n @twinfunction('pypy')\n def superlooper(count=1000, add=3, start=0):\n for _ in range(count):\n start += add\n return add\n\n print(superlooper(int(1E6), 1))\n\n:note: A `cpy2py.twinfunction` is a regular function wrapping a\n callable. Unlike a `cpy2py.TwinObject`, it will not pass\n attribute assignments.\n\nDebugging\n---------\n\nThe core of `cpy2py` supports some `logging` facilities.\nAll such loggers are children of the ``__cpy2py__`` logger. By default,\nno active handlers are attached and propagation is disabled. If needed,\nyou reconfigure them like any other `logging` logger to suit your\nneeds.\nNote that if python is run with the `-O` flag, several logging calls are\nskipped entirely to improve performance.\n\nFor small scale debugging, one can set the environment variable\n`CPY2PY_DEBUG`. If it is defined and not empty, logging output\nis written to `stderr`. In addition, if it names a valid `logging`\nlevel, that logging level is used.\n\nNote that loggers are meant for development and only address the internal\nstate. Your application should not depend on this information. Unless\n`cpy2py` misbehaves (or you suspect it to), ignore its logging.\n\nCurrent Status\n==============\n\nCPy2Py is stable at its core, but still has some features missing.\nWhat's there is more than sufficient to significantly enhance your applications.\n\nFeatures\n--------\n\n* Seamlessly integrates into python code.\n\n * All internals are wrapped away behind the plain python interfaces.\n No eval, exec or code strings required.\n\n * Lightweight hooks optimize objects and functions for use with `cpy2py`.\n\n * If needed, **any** pickle'able callable can be dispatched to another interpreter.\n\n* Objects natively integrate with twinterpreters.\n\n * Objects can live in a specific interpreter, with proxies replacing them in others.\n Classes and instances transparently interact with `cpy2py` in the background.\n\n * Both class and instance attributes work as expected.\n Methods, classmethods, staticmethods and descriptors are fully supported.\n\n * Inheritance is fully supported, including multiple inheritance.\n Affiliation to interpreters can be changed freely.\n\n* A wide range of interpeters is supported.\n\n * Pure python, no dependencies means perfect portability.\n\n * Any interpreter compatible with python 2.6 to 3.7 is supported.\n\n * Virtual Environments work out of the box.\n\n * Tested with cpython and pypy, on Linux and Mac OSX.\n\nGotchas/Limitations\n-------------------\n\n* Importing functions and classes from `__main__` may fail if the module can only be imported via its path.\n\n* By default, calls across interpreters are blocking and not threadsafe.\n If recursion switches between twinterpreters, `cpy2py.TwinMaster` must use the ``'async'`` kernel.\n\n* Module level settings are not synchronized.\n For example, configuration of `logging` is not applied to twinterpreters.\n Use `cpy2py.twinterpreter.group_state.TwinGroupState` for initialisation,\n write modules aware of twinterpreters, or use immutable module-level initializers.\n\n* A `weakref` to objects only takes local references into account, not cross-interpreter references.\n\nPerformance\n-----------\n\nDispatching to another twinterpreter adds about 200 - 300 us of overhead.\nThis is mainly due to serialization for the IPC between the interpreters.\nUsing the asynchronous kernel, there is an additional overhead for creating threads.\n\nIn general, twinterpreters get faster the shorter they have to wait between requests.\n``pypy`` twinterpreters benefit from a high number of requests, allowing their JIT to warm up.\nPython3 connections are the fastest, provided that both twinterpreters support pickle protocol 4.\n\nA notable fraction of time is spent on debugging output via `logging`.\nEven if no output is produced, `cpy2py` is optimized to a point where the *logging call* is noticeable.\nIf needed, any per-call logging can be disabled by running python in optimized mode.\nSee the python documentation on the `-O` option and `PYTHONOPTIMIZE` environment variable.\n\nYou can benchmark the overhead yourself using the `cpy2py_benchmark` tools.\n\n==================== ==================== ==================== ====================\n pypy2 15x15k 30x5k 300x1\n==================== ==================== ==================== ====================\n pypy2 187 \u00b1 1.5 us 228 \u00b1 2.5 us 505 \u00b1 51.8 us\n pypy3 165 \u00b1 1.3 us 209 \u00b1 2.4 us 402 \u00b1 8.0 us\n python2.7 178 \u00b1 0.6 us 139 \u00b1 0.3 us 239 \u00b1 7.6 us\n python3.4 149 \u00b1 0.4 us 118 \u00b1 0.2 us 258 \u00b1 8.0 us\n==================== ==================== ==================== ====================", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/maxfischer2781/cpy2py", "keywords": "interpreter framework development ipc processing pypy cpython", "license": "Apache V2.0", "maintainer": null, "maintainer_email": null, "name": "cpy2py", "package_url": "https://pypi.org/project/cpy2py/", "platform": "Operating System :: OS Independent", "project_url": "https://pypi.org/project/cpy2py/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/maxfischer2781/cpy2py" }, "release_url": "https://pypi.org/project/cpy2py/0.17.1/", "requires_dist": null, "requires_python": null, "summary": "Framework for combining different python interpeters", "version": "0.17.1" }, "last_serial": 2505431, "releases": { "0.10.0": [ { "comment_text": "", "digests": { "md5": "9f56f44086709bd07defb7093552af1f", "sha256": "3ec6a9ae0c3ec8e3f9df0e3c1a0eb3565ba02308c7ded89474c22d8006fba743" }, "downloads": -1, "filename": "cpy2py-0.10.0.tar.gz", "has_sig": false, "md5_digest": "9f56f44086709bd07defb7093552af1f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21336, "upload_time": "2016-04-10T11:50:30", "url": "https://files.pythonhosted.org/packages/ea/6c/5bdd14cf0b2aed5febd01165d6cd6149be8742af9626951c09faa5900343/cpy2py-0.10.0.tar.gz" } ], "0.11.0": [ { "comment_text": "", "digests": { "md5": "f5bd298994d91778923429cfa0bc547f", "sha256": "b6cf525f9a6df05a2851c104c33fabfd477cd759833446bffca6cc992b99257b" }, "downloads": -1, "filename": "cpy2py-0.11.0.tar.gz", "has_sig": false, "md5_digest": "f5bd298994d91778923429cfa0bc547f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21600, "upload_time": "2016-04-15T12:01:35", "url": "https://files.pythonhosted.org/packages/47/7f/42e885af045a702a00f817e591bd28383ada4a9a37d61bc85e588b0d59cf/cpy2py-0.11.0.tar.gz" } ], "0.12.0": [ { "comment_text": "", "digests": { "md5": "0ebbdbd8bb749b7f7ee2154355f1ea5b", "sha256": "79522cbbf5bc32696e1855c89455f141a9f1e00967b5273700c83ea6000aa3eb" }, "downloads": -1, "filename": "cpy2py-0.12.0.tar.gz", "has_sig": false, "md5_digest": "0ebbdbd8bb749b7f7ee2154355f1ea5b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21834, "upload_time": "2016-04-16T08:54:51", "url": "https://files.pythonhosted.org/packages/4e/d0/e699b40cc9b53a6735a1dd51bcafe37167ba209c7681faddd265363b247e/cpy2py-0.12.0.tar.gz" } ], "0.13.0": [ { "comment_text": "", "digests": { "md5": "280619ff6bd1af6eb14e392273ab1209", "sha256": "2d32d063de2ec6c192220c574c062d094d31be11c3202186dcebd5550c4ba5a8" }, "downloads": -1, "filename": "cpy2py-0.13.0.tar.gz", "has_sig": false, "md5_digest": "280619ff6bd1af6eb14e392273ab1209", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23625, "upload_time": "2016-04-20T09:37:17", "url": "https://files.pythonhosted.org/packages/86/c5/24830831463047ae990733a85657f36e078e0dcc94f72d3876cab357ffb4/cpy2py-0.13.0.tar.gz" } ], "0.14.0": [ { "comment_text": "", "digests": { "md5": "0aeaa34229b84dd8cdf345c2343f1ee7", "sha256": "84086b31a1a446504c0a12e4b990e7224148d770c07f3c1e1f213debd2d22498" }, "downloads": -1, "filename": "cpy2py-0.14.0.tar.gz", "has_sig": false, "md5_digest": "0aeaa34229b84dd8cdf345c2343f1ee7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25788, "upload_time": "2016-04-28T15:47:38", "url": "https://files.pythonhosted.org/packages/84/ab/b90a60fcfe27070bfbf016414250d617513382ac15f75f9cbf4313f55d81/cpy2py-0.14.0.tar.gz" } ], "0.15.1": [ { "comment_text": "", "digests": { "md5": "3a69135a46ac609ad40cce53d14d4fb7", "sha256": "76eb273906bacc4eacda8665f565d54e1f4a1f876ee298680f0e213e6d0c7c50" }, "downloads": -1, "filename": "cpy2py-0.15.1.tar.gz", "has_sig": false, "md5_digest": "3a69135a46ac609ad40cce53d14d4fb7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28475, "upload_time": "2016-05-03T09:57:08", "url": "https://files.pythonhosted.org/packages/69/dc/0119061b82c119489f74cb304ca6b023768f197791b2b7ca96c42d66aebf/cpy2py-0.15.1.tar.gz" } ], "0.15.3": [ { "comment_text": "", "digests": { "md5": "49812b2732659e7e5408f69c9c814450", "sha256": "8a4f6a01a05822d0ab08473c17ab780251039932156aeeba69c69b197a1606ee" }, "downloads": -1, "filename": "cpy2py-0.15.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "49812b2732659e7e5408f69c9c814450", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 61413, "upload_time": "2016-05-16T12:57:54", "url": "https://files.pythonhosted.org/packages/05/52/f2126ce7e82a57ecbd707becc5cd21960c2249b5b8319100083f71af30f2/cpy2py-0.15.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6d9e5f505487b458a602080d7ce892f2", "sha256": "6c61d23a9efa6a88baf7927db51c6559101047d046b436c77149f5645e17d1f9" }, "downloads": -1, "filename": "cpy2py-0.15.3.tar.gz", "has_sig": false, "md5_digest": "6d9e5f505487b458a602080d7ce892f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33311, "upload_time": "2016-05-15T06:23:19", "url": "https://files.pythonhosted.org/packages/2d/77/66771822eb67d40f18bd54dadcb1bf319bd203c8e354291b59397b7629a9/cpy2py-0.15.3.tar.gz" } ], "0.16.0": [ { "comment_text": "", "digests": { "md5": "08e1d32fc8f2a422451885c44ca0ee03", "sha256": "b1addf9107a549661beb0fb01a067794cde6e24a1317b7df80c6e277a405c4b9" }, "downloads": -1, "filename": "cpy2py-0.16.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "08e1d32fc8f2a422451885c44ca0ee03", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 64076, "upload_time": "2016-05-18T11:41:35", "url": "https://files.pythonhosted.org/packages/85/c7/a72c15ba74fcdd52648bba8ef3ec9a1f09edfce3ebf65cd587cc1063b2da/cpy2py-0.16.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b543baf2b9b47d4418efab174b857d9d", "sha256": "328adc419b89ca6eff22c5c8a980136021a857614e0acbee3032c48dff0a8f90" }, "downloads": -1, "filename": "cpy2py-0.16.0.tar.gz", "has_sig": false, "md5_digest": "b543baf2b9b47d4418efab174b857d9d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35126, "upload_time": "2016-05-18T11:41:21", "url": "https://files.pythonhosted.org/packages/82/b0/8220a53edc472609d2a3bbfc749d72f3a775e8ca3f0f134a70d636138625/cpy2py-0.16.0.tar.gz" } ], "0.16.1": [ { "comment_text": "", "digests": { "md5": "50dff65673f9d15c32d6fec26be1d36b", "sha256": "e736848b5e481a09de9b154364aba7cb418d6969cba6efecd6a2741ebf280493" }, "downloads": -1, "filename": "cpy2py-0.16.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "50dff65673f9d15c32d6fec26be1d36b", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 66654, "upload_time": "2016-09-15T20:56:11", "url": "https://files.pythonhosted.org/packages/7a/be/07bd4aa367dc87af27459178576e93fc8a5e3caf4f10fc93d9ca74efec86/cpy2py-0.16.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fd9389ebc19ca3ef069d44b5dd223953", "sha256": "7e89ef4d49283d333eea58bfc7102a3f3f6c101eea792ce89ac4ed210a5bbd50" }, "downloads": -1, "filename": "cpy2py-0.16.1.tar.gz", "has_sig": false, "md5_digest": "fd9389ebc19ca3ef069d44b5dd223953", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36529, "upload_time": "2016-09-15T20:56:08", "url": "https://files.pythonhosted.org/packages/f0/82/0557e8ab5e5942d2b04360e57c548bf3216f7b2291f2b688f2500be8662a/cpy2py-0.16.1.tar.gz" } ], "0.16.2": [ { "comment_text": "", "digests": { "md5": "4f9d70f956421ccf2b8ae4363a683723", "sha256": "6d94f12c226c1280dfea0589c97413263e084c510d1a18d17c5998d46b46f5b9" }, "downloads": -1, "filename": "cpy2py-0.16.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4f9d70f956421ccf2b8ae4363a683723", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 67220, "upload_time": "2016-09-16T13:13:10", "url": "https://files.pythonhosted.org/packages/49/a2/496d575d584b595f4855840a22eb69c1dcb230ccf4792bee40d74c367568/cpy2py-0.16.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "555d36e6e69eeed07f1fe91390a0b628", "sha256": "f004e13f1ae7e9e10ca0bc4f1f6f95336509f252a7fc2326d3b64041d75f8537" }, "downloads": -1, "filename": "cpy2py-0.16.2.tar.gz", "has_sig": false, "md5_digest": "555d36e6e69eeed07f1fe91390a0b628", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36951, "upload_time": "2016-09-16T13:13:07", "url": "https://files.pythonhosted.org/packages/7b/66/b592d394add4fc91583be2024f1f3bc50483e2140b547b9626b841b97336/cpy2py-0.16.2.tar.gz" } ], "0.17.0": [ { "comment_text": "", "digests": { "md5": "310be834d1a61caf97cdb231126f7c48", "sha256": "b2ec5bacffc3b93a394f278f97384e932329fcf511642a1aac8649daaaeb0993" }, "downloads": -1, "filename": "cpy2py-0.17.0.tar.gz", "has_sig": false, "md5_digest": "310be834d1a61caf97cdb231126f7c48", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38868, "upload_time": "2016-11-16T21:43:56", "url": "https://files.pythonhosted.org/packages/c7/82/62b3e26fee65da393e4a962d1be5569b7109ec1d65accd6d172edbaf30ba/cpy2py-0.17.0.tar.gz" } ], "0.17.1": [ { "comment_text": "", "digests": { "md5": "6be20c789178621c25ecc5144437adfd", "sha256": "b101d32d8cd0f7b5871869946f2c24f816b2c3b0bf317dc28d5cc3e9aa5c987e" }, "downloads": -1, "filename": "cpy2py-0.17.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6be20c789178621c25ecc5144437adfd", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 72893, "upload_time": "2016-12-07T19:41:51", "url": "https://files.pythonhosted.org/packages/e1/b9/c1bcc47268945cdea33ee72246030926097c660a15381a64092068c49ba0/cpy2py-0.17.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "96d6b1547ed2953447ebbf11c485bbb3", "sha256": "bb33b2c88cfb46052aedd0409617b0d4ac9d7c8a0fe5cc78ca03990c2d31251c" }, "downloads": -1, "filename": "cpy2py-0.17.1.tar.gz", "has_sig": false, "md5_digest": "96d6b1547ed2953447ebbf11c485bbb3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38920, "upload_time": "2016-12-07T19:41:48", "url": "https://files.pythonhosted.org/packages/e5/28/02d3278ac0df9c1e77b0100ec31344184457a72637b13a7830d077ade230/cpy2py-0.17.1.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "b21867a292848ecd9c7747c6624c5691", "sha256": "ae28945e07a7864a5deb8c1e01b4302fed6f1dfe715db80867eb2347a9b189dc" }, "downloads": -1, "filename": "cpy2py-0.9.0.tar.gz", "has_sig": false, "md5_digest": "b21867a292848ecd9c7747c6624c5691", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20781, "upload_time": "2016-04-08T07:36:12", "url": "https://files.pythonhosted.org/packages/24/9b/dcbcf270e212eb54c0ba99a064a107835e8279e3445a7c2c509e31f38188/cpy2py-0.9.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6be20c789178621c25ecc5144437adfd", "sha256": "b101d32d8cd0f7b5871869946f2c24f816b2c3b0bf317dc28d5cc3e9aa5c987e" }, "downloads": -1, "filename": "cpy2py-0.17.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6be20c789178621c25ecc5144437adfd", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 72893, "upload_time": "2016-12-07T19:41:51", "url": "https://files.pythonhosted.org/packages/e1/b9/c1bcc47268945cdea33ee72246030926097c660a15381a64092068c49ba0/cpy2py-0.17.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "96d6b1547ed2953447ebbf11c485bbb3", "sha256": "bb33b2c88cfb46052aedd0409617b0d4ac9d7c8a0fe5cc78ca03990c2d31251c" }, "downloads": -1, "filename": "cpy2py-0.17.1.tar.gz", "has_sig": false, "md5_digest": "96d6b1547ed2953447ebbf11c485bbb3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38920, "upload_time": "2016-12-07T19:41:48", "url": "https://files.pythonhosted.org/packages/e5/28/02d3278ac0df9c1e77b0100ec31344184457a72637b13a7830d077ade230/cpy2py-0.17.1.tar.gz" } ] }