{ "info": { "author": "Bastian Bechtold", "author_email": "basti@bastibe.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Science/Research", "License :: OSI Approved :: BSD License", "Operating System :: MacOS", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "TRANSPLANT\n==========\n\n|version| |python| |status| |license|\n\n|contributors| |downloads|\n\nTransplant is an easy way of calling Matlab from Python.\n\n.. code:: python\n\n import transplant\n matlab = transplant.Matlab()\n # call Matlab functions:\n length = matlab.numel([1, 2, 3])\n magic = matlab.magic(2)\n spectrum = matlab.fft(numpy.random.randn(100))\n # inject variables into Matlab:\n matlab.signal = numpy.zeros(100)\n\nPython lists are converted to cell arrays in Matlab, dicts are\nconverted to Maps, and Numpy arrays are converted do native Matlab\nmatrices.\n\nAll Matlab functions and objects can be accessed from Python.\n\n| Transplant is licensed under the terms of the BSD 3-clause license\n| (c) 2014 Bastian Bechtold\n\n\n|open-issues| |closed-issues| |open-prs| |closed-prs|\n\n.. |contributors| image:: https://img.shields.io/github/contributors/bastibe/transplant.svg\n.. |version| image:: https://img.shields.io/pypi/v/transplant.svg\n.. |python| image:: https://img.shields.io/pypi/pyversions/transplant.svg\n.. |license| image:: https://img.shields.io/github/license/bastibe/transplant.svg\n.. |downloads| image:: https://img.shields.io/pypi/dm/transplant.svg\n.. |open-issues| image:: https://img.shields.io/github/issues/bastibe/transplant.svg\n.. |closed-issues| image:: https://img.shields.io/github/issues-closed/bastibe/transplant.svg\n.. |open-prs| image:: https://img.shields.io/github/issues-pr/bastibe/transplant.svg\n.. |closed-prs| image:: https://img.shields.io/github/issues-pr-closed/bastibe/transplant.svg\n.. |status| image:: https://img.shields.io/pypi/status/transplant.svg\n\n\nRECENT CHANGES\n--------------\n\n- Should now reliably raise an error if Matlab dies unexpectedly.\n- Keyword arguments are now automatically translated to string-value\n pairs in Matlab.\n- ``close`` was renamed ``exit``. Even though Python typically uses\n ``close`` to close files and connections, this conflicts with Matlab's\n own ``close`` function.\n- Matlab will now start Matlab at the current working directory.\n- Transplant can now be installed through ``pip install transplant``.\n- You can now use ``jvm=False`` and ``desktop=False`` to auto-supply\n common command line arguments for Matlab.\n\n\nSTARTING MATLAB\n----------------\n\n.. code:: python\n\n matlab = transplant.Matlab()\n\nWill start a Matlab session and connect to it. This will take a few\nseconds while Matlab starts up. All of Matlab's output will go to the\nstandard output and will appear interspersed with Python output.\nStandard input is suppressed to make REPLs work, so Matlab's ``input``\nfunction will not work.\n\nBy default, this will try to call ``matlab`` on the command line. If\nyou want to use a different version of Matlab, or ``matlab`` is not in\nPATH, use ``Matlab(executable='/path/to/matlab')``.\n\nBy default, Matlab is called with ``-nodesktop`` and ``-nosplash``\n(and ``-minimize`` on Windows), so no IDE or splash screen show up.\nYou can change this by setting ``desktop=True``.\n\nYou can start Matlab without loading the Java-based GUI system\n(``'-nojvm'``) by setting ``jvm=False``. This will speed up startup\nconsiderably, but you won't be able to open figures any more.\n\nIf you want to start Matlab with additional command line arguments,\nyou can supply them like this: ``Matlab(arguments=['-c licensefile'])``.\n\nBy default, Matlab will be started on the local machine. To start\nMatlab on a different computer, supply the IP address of that\ncomputer: ``Matlab(address='172.168.1.5')``. This only works if that\ncomputer is reachable through ``ssh``, Matlab is available on the\nother computer's command line, and transplant is in the other Matlab's\npath.\n\nNote that due to a limitation of Matlab on Windows, command line\noutput from Matlab running on Windows isn't visible to Transplant.\n\n\nCALLING MATLAB\n--------------\n\n.. code:: python\n\n matlab.disp(\"Hello, World\")\n\nWill call Matlab's ``disp`` function with the argument ``'Hello, World'``.\nIt is equivalent to ``disp('Hello, World')`` in Matlab. Return values\nwill be returned to Python, and errors will be converted to Python\nerrors (Matlab stack traces will be given, too!).\n\nInput arguments are converted to Matlab data structures:\n\n+-----------------------------------+-------------------------------+\n| Python Argument | Matlab Type |\n+===================================+===============================+\n| ``str`` | ``char`` vector |\n+-----------------------------------+-------------------------------+\n| ``float`` | ``double`` scalar |\n+-----------------------------------+-------------------------------+\n| ``int`` | an ``int{8,16,32,64}`` scalar |\n+-----------------------------------+-------------------------------+\n| ``True``/``False`` | ``logical`` scalar |\n+-----------------------------------+-------------------------------+\n| ``None`` | ``[]`` |\n+-----------------------------------+-------------------------------+\n| ``list`` | ``cell`` |\n+-----------------------------------+-------------------------------+\n| ``dict`` | ``containers.Map`` |\n+-----------------------------------+-------------------------------+\n| ``transplant.MatlabStruct(dict)`` | ``struct`` |\n+-----------------------------------+-------------------------------+\n| ``numpy.ndarray`` | ``double`` matrix |\n+-----------------------------------+-------------------------------+\n| ``scipy.sparse`` | ``sparse`` matrix |\n+-----------------------------------+-------------------------------+\n| proxy object | original object |\n+-----------------------------------+-------------------------------+\n\nReturn values are treated similarly:\n\n+----------------------------------+---------------------+\n| Matlab Return Value | Python Type |\n+==================================+=====================+\n| ``char`` vector | ``str`` |\n+----------------------------------+---------------------+\n| numeric scalar | number |\n+----------------------------------+---------------------+\n| ``logical`` scalar | ``True``/``False`` |\n+----------------------------------+---------------------+\n| ``[]`` | ``None`` |\n+----------------------------------+---------------------+\n| ``cell`` | ``list`` |\n+----------------------------------+---------------------+\n| ``struct`` or ``containers.Map`` | ``dict`` |\n+----------------------------------+---------------------+\n| numeric matrix | ``numpy.ndarray`` |\n+----------------------------------+---------------------+\n| sparse matrix | ``scipy.sparse`` |\n+----------------------------------+---------------------+\n| function | proxy function |\n+----------------------------------+---------------------+\n| object | proxy object |\n+----------------------------------+---------------------+\n\nIf the function returns a function handle or an object, a matching\nPython functions/objects will be created that forwards every access to\nMatlab. Objects can also be handed back to Matlab and will work as\nintended.\n\n.. code:: python\n\n f = matlab.figure() # create a Figure object\n f.Visible = 'off' # modify a property of the Figure object\n matlab.set(f, 'Visible', 'on') # pass the Figure object to a function\n\nIn Matlab, some functions behave differently depending on the number\nof output arguments. By default, Transplant uses the Matlab function\n``nargout`` to figure out the number of return values for a function.\nIf ``nargout`` can not determine the number of output arguments\neither, Matlab functions will return the value of ``ans`` after the\nfunction call.\n\nIn some cases, ``nargout`` will report a wrong number of output\narguments. For example ``nargout profile`` will say ``1``, but ``x =\nprofile('on')`` will raise an error that too few output arguments were\nused. To fix this, every function has a keyword argument ``nargout``,\nwhich can be used in these cases: ``matlab.profile('on', nargout=0)``\ncalls ``profile on`` with no output arguments. ``s, f, t, p =\nmatlab.spectrogram(numpy.random.randn(1000), nargout=4)`` returns all\nfour output arguments of ``spectrogram``.\n\nWhen working with plots, note that the Matlab program does not wait\nfor drawing on its own. Use ``matlab.drawnow()`` to make figures\nappear.\n\nNote that functions are not called in the base workspace. Functions\nthat access the current non-lexical workspace (this is very rare) will\ntherefore not work as expected. For example, ``matlab.truth = 42``,\n``matlab.exist('truth')`` will not find the ``truth`` variable. Use\n``matlab.evalin('base', \"exist('truth')\", nargout=1)`` instead in this\ncase.\n\nIf you hit Ctrl-C, the ``KeyboardInterrupt`` will be applied to both\nPython and Matlab, stopping any currently running function. Due to a\nlimitation of Matlab, the error and stack trace of that function will\nbe lost.\n\n\nMATRIX DIMENSIONS\n-----------------\n\nThe way multidimensional arrays are indexed in Matlab and Python are\nfundamentally different. Thankfully, the two-dimensional case works as\nexpected:\n\n::\n\n Python | Matlab\n --------------------------+------------------------\n array([[ 1, 2, 3], | 1 2 3\n [ 10, 20, 30]]) | 10 20 30\n\nIn both languages, this array has the shape ``(2, 3)``.\n\nWith higher-dimension arrays, this becomes harder. The next array is\nagain identical:\n\n::\n\n Python | Matlab\n --------------------------+------------------------\n array([[[ 1, 2], | (:,:,1) =\n [ 3, 4]], | 1 3\n | 10 30\n [[ 10, 20], | 100 300\n [ 30, 40]], | (:,:,2) =\n | 2 4\n [[100, 200], | 20 40\n [300, 400]]]) | 200 400\n\nEven though they look different, they both have the same shape ``(3,\n2, 2)``, and are indexed in the same way. The element at position ``a,\nb, c`` in Python is the same as the element at position ``a+1, b+1,\nc+1`` in Matlab (``+1`` due to zero-based/one-based indexing).\n\nYou can think about the difference in presentation like this: Python\ndisplays multidimensional arrays as ``[n,:,:]``, whereas Matlab\ndisplays them as ``(:,:,n)``.\n\n\nSTOPPING MATLAB\n---------------\n\nMatlab processes end when the ``Matlab`` instance goes out of scope or\nis explicitly closed using the ``exit`` method. Alternatively, the\n``Matlab`` class can be used as a context manager, which will properly\nclean up after itself.\n\nIf you are not using the context manager or the ``exit`` method, you\nwill notice that some Matlab processes don't die when you expect them\nto die. If you are running the regular ``python`` interpreter, chances\nare that the Matlab process is still referenced to in\n``sys.last_traceback``, which holds the value of the last exception\nthat was raised. Your Matlab process will die once the next exception\nis raised.\n\nIf you are running ``ipython``, though, all bets are off. I have\nnoticed that ``ipython`` keeps all kinds of references to all kinds of\nthings. Sometimes, ``%reset`` will clear them, sometimes it won't.\nSometimes they only go away when ``ipython`` quits. And sometimes,\neven stopping ``ipython`` doesn't kill it (how is this even\npossible?). This can be quite annoying. Use the ``exit`` method or the\ncontext manager to make sure the processes are stopped correctly.\n\n\nINSTALLATION\n------------\n\n1. Install the zeromq library on your computer and add it to your\n PATH. Alternatively, Transplant automatically uses ``conda``'s\n zeromq if you use conda.\n\n2. Install Transplant using ``pip install transplant``. This will\n install ``pyzmq``, ``numpy`` and ``msgpack`` as\n dependencies.\n\nIf you want to run Transplant over the network, the remote Matlab has\nto have access to *ZMQ.m* and *transplant_remote.m* and the zeromq\nlibrary and has to be reachable through SSH.\n\nINSTALLATION GUIDE FOR LINUX\n----------------------------\n\n1. Install the latest version of zeromq through your package manager.\n Install version 4 (often called 5).\n\n2. Make sure that Matlab is using the system's version of libstdc++.\n If it is using an incompatible version, starting Transplant might\n fail with an error like ``GLIBCXX_3.4.21 not found``. If you\n experience this, disable Matlab's own libstdc++ either by\n removing/renaming $MATLABROOT/sys/os/glnxa64/libstdc++, or by\n installing ``matlab-support`` (if you are running Ubuntu).\n\n\nINSTALLATION GUIDE FOR WINDOWS\n------------------------------\n\n1. Install the latest version of zeromq from here:\n http://zeromq.org/distro:microsoft-windows OR through conda.\n\n2. Install a compiler. See here for a list of supported compilers:\n http://uk.mathworks.com/support/compilers/R2017a/ Matlab needs a\n compiler in order to load and use the ZeroMQ library using\n ``loadlibrary``.\n\n\nHOW DOES IT WORK?\n-----------------\n\nTransplant opens Matlab as a subprocess (optionally over SSH), then\nconnects to it via `0MQ `_ in a request-response\npattern. Matlab then runs the *transplant* remote and starts listening\nfor messages. Now, Python can send messages to Matlab, and Matlab will\nrespond. Roundtrip time for sending/receiving and encoding/decoding\nvalues from Python to Matlab and back is about 2 ms.\n\nAll messages are Msgpack-encoded or JSON-encoded objects. You can\nchoose between Msgpack (faster) and JSON (slower, human-readable)\nusing the ``msgformat`` attribute of the ``Matlab`` constructor. There\nare seven messages types used by Python:\n\n* ``set_global`` and ``get_global`` set and retrieve a global\n variable.\n* ``del_proxy`` removes a cached object.\n* ``call`` calls a Matlab function with some function arguments and\n returns the result.\n* ``die`` tells Matlab to shut down.\n\nMatlab can then respond with one of three message types:\n\n* ``ack`` for successful execution.\n* ``value`` for return values.\n* ``error`` if there was an error during execution.\n\nIn addition to the regular Msgpack/JSON data types, _transplant_ uses\nspecially formatted Msgpack/JSON arrays for transmitting numerical\nmatrices as binary data. A numerical 2x2 32-bit integer matrix\ncontaining ``[[1, 2], [3, 4]]`` would be encoded as ``[\"__matrix__\",\n\"int32\", [2, 2], \"AQAAAAIAAAADAAAABAAAA==\\n\"]``, where ``\"int32\"`` is\nthe data type, ``[2, 2]`` is the matrix shape and the long string is\nthe base64-encoded matrix content. This allows for efficient data\nexchange and prevents rounding errors due to JSON serialization. In\nMsgpack, the data is not base64-encoded.\n\nWhen Matlab returns a function handle, it is encoded as\n``[\"__function__\", func2str(f)]``. When Matlab returns an object, it\ncaches its value and returns ``[\"__object__\", cache_idx]``. These\narrays are translated back to their original Matlab values if passed\nto Matlab.\n\nNote that this project includes a Msgpack serializer/parser, a JSON\nserializer/parser, and a Base64 encoder/decoder in pure Matlab.\n\n\nFAQ\n---\n\n* I get errors with integer numbers\n Many Matlab functions crash if called with integers. Convert your\n numbers to ``float`` in Python to fix this problem.\n\n* How do I pass structs to Matlab?\n Since Matlab structs can't use arbitrary keys, all Python\n dictionaries are converted to Matlab ``containers.Map`` instead of\n structs. Wrap your dicts in ``transplant.MatlabStruct`` in Python to\n have them converted to structs. Note that this will change all\n invalid keys to whatever Matlab thinks is an appropriate key name\n using ``matlab.lang.makeValidName``.\n\n* I get errors like ``GLIBCXX_3.4.21 not found``\n Matlab's version of libstdc++ is incompatible with your OS's\n version. See INSTALLATION GUIDE FOR LINUX for details.\n\n* Does Transplant work in Python 2.7?\n No, it does not.\n\n* How to integrate Transplant with Jupyter?\n Use the provided ``transplant_magic.py``, to get %%matlab cell\n magic.\n\n\nSIMILAR PROGRAMS\n----------------\n\nI know of two programs that try to do similar things as Transplant:\n\n- Mathwork's own `MATLAB Engine API for Python`_ provides a CPython\n extension for calling Matlab code from some versions of Python. In\n my experience, it is significantly slower than Transplant, less\n feature-complete (no support for non-scalar structs, objects,\n methods, packages, numpy), and more cumbersome to use (all arguments\n and return values need to be wrapped in a ``matlab.double`` instead\n of Numpy Arrays). For a comparison of the two, here are two blog\n posts on the topic: `Intro to Transplant`_, `Transplant speed`_.\n- Oct2Py calls Octave from Python. It is very similar to Transplant,\n but uses Octave instead of Matlab. This has huge benefits in startup\n time, but of course doesn't support all Matlab code.\n\n.. _MATLAB Engine API for Python: http://mathworks.com/help/matlab/matlab-engine-for-python.html\n.. _Intro to Transplant: http://bastibe.de/2016-06-21-transplant-revisited.html\n.. _Transplant speed: http://bastibe.de/2015-11-03-matlab-engine-performance.html\n\nKNOWN ISSUES\n-------------\n\nTransplant is a side project of mine that I use for running\ncross-language experiments on a small compute cluster. As such, my\nusage of Transplant is very narrow, and I do not see bugs that don't\nhappen in my typical usage. That said, I have used Transplant for\nhundreds of hours, and hundreds of Gigabytes of data without errors.\n\nIf you find a bug, or would like to discuss a new feature, or would\nlike to contribute code, please open an issue on Github.\n\nI do not have a Windows machine to test Transplant. Windows support\nmight contain bugs, but at least one user has used it on Windows in\nthe past. If you are hitting problems on Windows, please open an issue\non Github.\n\nRunning Transplant over the network might contain bugs. If you are\nhitting problems, please open an issue on Github.\n\nFinally, I would like to remind you that I am developing this project\nfor free, and in my spare time. While I try to be as accomodating as\npossible, I can not guarantee a timely response to issues. Publishing\nOpen Source Software on Github does not imply an obligation to *fix\nyour problem right now*. Please be civil.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/bastibe/transplant", "keywords": "", "license": "BSD 3-clause", "maintainer": "", "maintainer_email": "", "name": "Transplant", "package_url": "https://pypi.org/project/Transplant/", "platform": "", "project_url": "https://pypi.org/project/Transplant/", "project_urls": { "Homepage": "https://github.com/bastibe/transplant" }, "release_url": "https://pypi.org/project/Transplant/0.8.10/", "requires_dist": [ "numpy", "pyzmq", "msgpack" ], "requires_python": ">=3.4", "summary": "Call Matlab from Python (requires Matlab)", "version": "0.8.10" }, "last_serial": 5471351, "releases": { "0.8.10": [ { "comment_text": "", "digests": { "md5": "9ba8d0825ad52ffc30f2313b363a9f17", "sha256": "61d409f4fd499d018d5691314b42809f349dba37b52b89cc09b2f071e8a72975" }, "downloads": -1, "filename": "Transplant-0.8.10-py3-none-any.whl", "has_sig": false, "md5_digest": "9ba8d0825ad52ffc30f2313b363a9f17", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 37458, "upload_time": "2019-07-01T14:30:05", "url": "https://files.pythonhosted.org/packages/77/56/6bced46563c2eee6eb3c150fee6d73a454788407d8c0c1e13202c8a3cf12/Transplant-0.8.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4c2d8f03c4f4d3ed26094a0a4dafd0e2", "sha256": "9d02530f7bd3dec08242ff91f725862028b07839895ab1d26498c18d275057df" }, "downloads": -1, "filename": "Transplant-0.8.10.tar.gz", "has_sig": false, "md5_digest": "4c2d8f03c4f4d3ed26094a0a4dafd0e2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 39528, "upload_time": "2019-07-01T14:30:07", "url": "https://files.pythonhosted.org/packages/aa/41/edbc794dd5fe4e9b09b0ea94d131bfe9e6af2bb81c0d4feda0a3bb9a2f1a/Transplant-0.8.10.tar.gz" } ], "0.8.2": [ { "comment_text": "", "digests": { "md5": "aff278c9090faafa501908c748d4e967", "sha256": "0db9395c673178e121d9a5c0450a6627201a42acbcae92d2d92c811d37716cea" }, "downloads": -1, "filename": "Transplant-0.8.2.tar.gz", "has_sig": false, "md5_digest": "aff278c9090faafa501908c748d4e967", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 23588, "upload_time": "2017-07-26T14:53:01", "url": "https://files.pythonhosted.org/packages/73/e2/d294618c855c3ee88c40d36cf198af9f39b8b84cac3df671dc04ca02b73c/Transplant-0.8.2.tar.gz" } ], "0.8.4": [ { "comment_text": "", "digests": { "md5": "d15486bf440e30059339fc0beaebb112", "sha256": "c909c91e399d6b11f03c8bcad8b59191f9879972b11406d0d4ea033086a1b471" }, "downloads": -1, "filename": "Transplant-0.8.4-py3-none-any.whl", "has_sig": false, "md5_digest": "d15486bf440e30059339fc0beaebb112", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 29507, "upload_time": "2018-01-30T07:58:59", "url": "https://files.pythonhosted.org/packages/35/d8/df01f21137436d240a7186d6ad9d7bef5cf76f8e1f1643f5df263ca265ab/Transplant-0.8.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d30fa09c2d46005963aac8c8dda49d7b", "sha256": "bc16928a303361a82844896c7787cf07742e7d0792df20eb50ffdbed1f843c1b" }, "downloads": -1, "filename": "Transplant-0.8.4.tar.gz", "has_sig": false, "md5_digest": "d30fa09c2d46005963aac8c8dda49d7b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 24080, "upload_time": "2018-01-30T07:59:01", "url": "https://files.pythonhosted.org/packages/a5/3e/a5abacd0bbe8803c5b8adad0ddfbfb8e0bb82333105b5286017ba2e5b35c/Transplant-0.8.4.tar.gz" } ], "0.8.5": [ { "comment_text": "", "digests": { "md5": "08d5f26ff24087364dfc0a16698366b0", "sha256": "5d86c3a20bd02ddf6b24e7d3d326b2fe2dcb1bc4d36109e10154c472f48ed374" }, "downloads": -1, "filename": "Transplant-0.8.5-py3-none-any.whl", "has_sig": false, "md5_digest": "08d5f26ff24087364dfc0a16698366b0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 29551, "upload_time": "2018-02-08T10:35:04", "url": "https://files.pythonhosted.org/packages/ac/bd/86a6cf7b300bb35e71f012616599f43f3ac8c52afadccf829ff91c5482a5/Transplant-0.8.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "46be2516068bffafd58f8501ec518c8f", "sha256": "2cb03ebc6c5a43cd76df731258d9019e4a057c523a1c4beede3fde29867ec102" }, "downloads": -1, "filename": "Transplant-0.8.5.tar.gz", "has_sig": false, "md5_digest": "46be2516068bffafd58f8501ec518c8f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 24154, "upload_time": "2018-02-08T10:35:07", "url": "https://files.pythonhosted.org/packages/ca/82/a1666705f2a3a348a5498cda7f0d665ba8a4601401a0ae17a4cb47436501/Transplant-0.8.5.tar.gz" } ], "0.8.6": [ { "comment_text": "", "digests": { "md5": "2aed4538d807577b962e41e75084cf96", "sha256": "40676e6adbf70652f5f2da5816c961146ef0b82e30b01dd5953600f8b3698b79" }, "downloads": -1, "filename": "Transplant-0.8.6-py3-none-any.whl", "has_sig": false, "md5_digest": "2aed4538d807577b962e41e75084cf96", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 28886, "upload_time": "2018-04-20T13:35:43", "url": "https://files.pythonhosted.org/packages/22/e6/805f71dcb7bc92775dcdd77a93e8998904cf77e40d7a6865160ac611619a/Transplant-0.8.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cd529a4474a8192ed241f67dc11c0cf6", "sha256": "bb7eb4d25428a81129bb0d97cb6558ab7e940849e86e9c820d9cf714e4d9b1ae" }, "downloads": -1, "filename": "Transplant-0.8.6.tar.gz", "has_sig": false, "md5_digest": "cd529a4474a8192ed241f67dc11c0cf6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 23911, "upload_time": "2018-04-20T13:35:44", "url": "https://files.pythonhosted.org/packages/f8/f0/5e17f8fdf90c347d4323a8c6f69d89b410d60a1280c7f65cfdc027c7013c/Transplant-0.8.6.tar.gz" } ], "0.8.7": [ { "comment_text": "", "digests": { "md5": "a2032826c5cbd76fb492e604ce474858", "sha256": "3782bfb97095990d24374667e98f6e5925693eede55bab907e8773bb783abf6d" }, "downloads": -1, "filename": "Transplant-0.8.7-py3-none-any.whl", "has_sig": false, "md5_digest": "a2032826c5cbd76fb492e604ce474858", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 28902, "upload_time": "2018-04-24T11:55:06", "url": "https://files.pythonhosted.org/packages/be/c2/83b694f3e64fc233aac8b9a5e0b64ccf75f330274b94332813af1f3122c2/Transplant-0.8.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e1f2c3a9ac94885c501bb9d1be477575", "sha256": "1334da797cbb3987002e8cc68cf26794c8844f1ed1bfe9563bc1818738fd2992" }, "downloads": -1, "filename": "Transplant-0.8.7.tar.gz", "has_sig": false, "md5_digest": "e1f2c3a9ac94885c501bb9d1be477575", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 31049, "upload_time": "2018-04-24T11:55:07", "url": "https://files.pythonhosted.org/packages/9f/98/00f517df4911161e54894521095024154e868620be39235392902384fc0b/Transplant-0.8.7.tar.gz" } ], "0.8.8": [ { "comment_text": "", "digests": { "md5": "e2bba8774f70cb188284231844fcfc5b", "sha256": "f437a84d456b5baa49595ef84c7fed5be7dd636f80f9cf2d13cebb1879741f12" }, "downloads": -1, "filename": "Transplant-0.8.8-py3-none-any.whl", "has_sig": false, "md5_digest": "e2bba8774f70cb188284231844fcfc5b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 37328, "upload_time": "2018-11-29T13:53:19", "url": "https://files.pythonhosted.org/packages/03/d1/766f67eea6b2ead4b5d15f5a60dcd71ce09bc81dc13dc1edf75ad70ede61/Transplant-0.8.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "61423c036a96faf8ee7d357f881d3341", "sha256": "f5e3425d8a006bdecf1140b295bfb0c6249c546ffec3e012d27f6c253672e77a" }, "downloads": -1, "filename": "Transplant-0.8.8.tar.gz", "has_sig": false, "md5_digest": "61423c036a96faf8ee7d357f881d3341", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 42171, "upload_time": "2018-11-29T13:53:21", "url": "https://files.pythonhosted.org/packages/bf/ff/173bd8e2a0a2d785085f8db68d0bd6a84294f0961306ec84b2357a820db4/Transplant-0.8.8.tar.gz" } ], "0.8.9": [ { "comment_text": "", "digests": { "md5": "a8e5d60a3ed3361baf72952ee87d41e9", "sha256": "70ad4c3304ec6c874996376dd86a67b9cfedce3e9a324136157ba69b0d150bc3" }, "downloads": -1, "filename": "Transplant-0.8.9-py3-none-any.whl", "has_sig": false, "md5_digest": "a8e5d60a3ed3361baf72952ee87d41e9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 37404, "upload_time": "2019-02-27T10:19:36", "url": "https://files.pythonhosted.org/packages/1d/3c/cedb225c080104a485d1ed0bc785a424c8ce5a4adb65dd659185437461be/Transplant-0.8.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ae88d5bf7970ae4416a392116dfab8c6", "sha256": "36dc5c493a398b34d2f5a09f8ecd0ab18fa8c8c5857a87ac6a6867ed429e7270" }, "downloads": -1, "filename": "Transplant-0.8.9.tar.gz", "has_sig": false, "md5_digest": "ae88d5bf7970ae4416a392116dfab8c6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 39416, "upload_time": "2019-02-27T10:19:38", "url": "https://files.pythonhosted.org/packages/5f/1f/de2ee81b087f78fd4429be358b93aa1ce02b0ba31c5379f23ecaa240f114/Transplant-0.8.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9ba8d0825ad52ffc30f2313b363a9f17", "sha256": "61d409f4fd499d018d5691314b42809f349dba37b52b89cc09b2f071e8a72975" }, "downloads": -1, "filename": "Transplant-0.8.10-py3-none-any.whl", "has_sig": false, "md5_digest": "9ba8d0825ad52ffc30f2313b363a9f17", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.4", "size": 37458, "upload_time": "2019-07-01T14:30:05", "url": "https://files.pythonhosted.org/packages/77/56/6bced46563c2eee6eb3c150fee6d73a454788407d8c0c1e13202c8a3cf12/Transplant-0.8.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4c2d8f03c4f4d3ed26094a0a4dafd0e2", "sha256": "9d02530f7bd3dec08242ff91f725862028b07839895ab1d26498c18d275057df" }, "downloads": -1, "filename": "Transplant-0.8.10.tar.gz", "has_sig": false, "md5_digest": "4c2d8f03c4f4d3ed26094a0a4dafd0e2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.4", "size": 39528, "upload_time": "2019-07-01T14:30:07", "url": "https://files.pythonhosted.org/packages/aa/41/edbc794dd5fe4e9b09b0ea94d131bfe9e6af2bb81c0d4feda0a3bb9a2f1a/Transplant-0.8.10.tar.gz" } ] }