{ "info": { "author": "Mat Leonard", "author_email": "leonard.mat@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# Abode: Friendly Python Packaging\n\nMost experienced Python users know that Python packaging is rough. Abode is an attempt to make things nicer by extending [Conda](https://docs.conda.io/en/latest/index.html). It uses Conda under the hood, but makes things a bit easier and robust.\n\nConda is by far my preferred packaging solution. It works as an environment manager (better than virtualenv in my opinion) as well as a package manager. The default repository is focused on data science software. However, Conda also installs packages from PyPI with pip. Also, unlike pip, Conda installs non-Python libraries such as MKL and CUDA that often increase operation speeds by 10-100x.\n\n**An aside:** I recommend installing [Miniconda](https://docs.conda.io/en/latest/miniconda.html) instead of the full Anaconda distribution. The vast majority of people won't need every single package in the Anaconda distribution. So save yourself some time, bandwidth, and storage. Install Miniconda, then create environments and install packages as needed.\n\n## The Main Attraction\n\nThe biggest issue with Conda is saving an environment's dependencies and sharing it across platforms. You can get the dependencies using `conda env export > environment.yml`. Say I have an environment where I have installed Flask, Numpy, and PyTorch. Even though those are the only packages I intentionally installed, Conda installs all the dependencies as well. Conda exports the environment to a YAML file that looks like:\n\n```\nname: flask\nchannels:\n - pytorch\n - defaults\ndependencies:\n - blas=1.0=mkl\n - ca-certificates=2019.5.15=1\n - certifi=2019.6.16=py37_1\n - cffi=1.12.3=py37hb5b8e2f_0\n - intel-openmp=2019.4=233\n - libcxx=4.0.1=hcfea43d_1\n - libcxxabi=4.0.1=hcfea43d_1\n - libedit=3.1.20181209=hb402a30_0\n - libffi=3.2.1=h475c297_4\n - libgfortran=3.0.1=h93005f0_2\n - mkl=2019.4=233\n - mkl-service=2.0.2=py37h1de35cc_0\n - mkl_fft=1.0.14=py37h5e564d8_0\n - mkl_random=1.0.2=py37h27c97d8_0\n - ncurses=6.1=h0a44026_1\n - ninja=1.9.0=py37h04f5b5a_0\n - numpy=1.16.4=py37hacdab7b_0\n - numpy-base=1.16.4=py37h6575580_0\n - openssl=1.1.1c=h1de35cc_1\n - pip=19.1.1=py37_0\n - pycparser=2.19=py37_0\n - python=3.7.4=h359304d_1\n - pytorch=1.2.0=py3.7_0\n - readline=7.0=h1de35cc_5\n - setuptools=41.0.1=py37_0\n - six=1.12.0=py37_0\n - sqlite=3.29.0=ha441bb4_0\n - tk=8.6.8=ha441bb4_0\n - wheel=0.33.4=py37_0\n - xz=5.2.4=h1de35cc_4\n - zlib=1.2.11=h1de35cc_3\n - pip:\n - click==7.0\n - flask==1.1.1\n - itsdangerous==1.1.0\n - jinja2==2.10.1\n - markupsafe==1.1.1\n - werkzeug==0.15.5\nprefix: /Users/mat/miniconda3/envs/flask\n```\n\nThe issue here is that defining the versions potentially breaks the environment on platforms other than the original one. I created this environment on my MacBook. It is not guaranteed that all these dependencies are available for Linux or Windows, likely breaking the environment on these platforms.\n\nAlso, a lot of the time we're not concerned with the exact versions of our packages. Instead we are okay with the newest versions, or any version greater than some release with a specific feature. In these cases, locking to specific versions is overly strict.\n\nYou can create essentially the same environment with this file:\n\n```\nname: flask\nchannels:\n - pytorch\n - defaults\ndependencies:\n - numpy\n - pip\n - python=3\n - pytorch\n - pip:\n - flask\nprefix: /Users/mat/miniconda3/envs/flask\n```\n\nConda will take this file and solve all the necessary dependencies on whatever platform you're using. Of course if there are specific versions you want (like `python=3` here) you can define those.\n\nAbode manages Conda environments by creating and editing minimal environment files like these. Hopefully this will allow users to take advantage of the great things Conda is doing, while making the environments portable.\n\n## Abode Dependencies\n- Python 3.6+ because I like f-strings\n- PyYAML\n- Conda, as noted above, I suggest installing Miniconda instead of the full Anaconda distribution\n\n## Installation\n\nAbode is available from PyPI:\n\n```\npip install abode\n```\n\n## Usage\n\n**Warning:** This is very early. Use at your own risk.\n\nSo far this is what I have implemented.\n\n### Create an environment\n\nTo create a new environment with Python 3 installed:\n```\nabode create -n env_name python=3\n```\n\nBehind the scenes this creates an environment file and uses Conda to create an environment *from the file*.\n\n#### Create from environment file\nTo create an environment from an environment file (a YAML file created by Abode or Conda):\n```\nabode create -f FILE\n```\n\n\n### Enter an environment\nI haven't figure out how to do this without using conda in the shell, so for now:\n\n```\nconda activate env_name\n```\nThis is pretty high priority for me. It's awkward to switch between abode and conda commands.\n\n### Install packages\n\nInstalling packages is the same as Conda:\n\n```\nabode install numpy matplotlib\n```\n\nBehind the scenes, Abode is adding these dependencies to the environment file, then updating the environment *from the file*.\n\n\n#### Install with pip\n\nUse the `--pip` flag to install a package with pip.\n\n```\nabode install flask --pip\n```\n\n#### Install from a non-default channel\n\nThe channel option `-c` adds the channel to the environment file.\n\n```\nabode install pytorch -c pytorch\n```\n\n### Update packages\n\nThis updates all the packages in the environment without locked versions.\n\n```\nabode update\n```\n\n### Export the environment\n\n```\nabode export > environment.yml\n```\n\nThis just copies the active environment's dependency file to the new file.\n\n### List packages in the current environment\n\nTo print out the list of all installed packages, equivalent to `conda list`:\n```\nabode list\n```\n\nIf you want to see which packages have been installed with Abode:\n```\nabode list -f\n```\nor \n\n```\nabode list --file\n```\n\n### List environments managed with Abode\n\n```\nabode env list\n```\n\n## Contributions\n\nHappy to work with you on this. Create an issue or a pull request. Say hi.\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/mcleonard/abode", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "abode", "package_url": "https://pypi.org/project/abode/", "platform": "", "project_url": "https://pypi.org/project/abode/", "project_urls": { "Homepage": "https://github.com/mcleonard/abode" }, "release_url": "https://pypi.org/project/abode/0.1.4/", "requires_dist": [ "pyyaml" ], "requires_python": "", "summary": "Python Environment and Package Manager", "version": "0.1.4" }, "last_serial": 5756851, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "b94ea932282deb2bc81373045136eebf", "sha256": "ba1e9f85f023faaedc1a31bb1e6430eb6b0aa8908cf9e4a30ef2b3899f8645dd" }, "downloads": -1, "filename": "abode-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b94ea932282deb2bc81373045136eebf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6771, "upload_time": "2019-08-18T21:26:53", "url": "https://files.pythonhosted.org/packages/3d/90/d1e0b0adbfd4882e47c2a034c379323f69d96f5d2b7305f20095d5b7a1a0/abode-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1819edce08122c0c847fd96c67fe1db2", "sha256": "f1e08299d7727a86d5f3114f322133c8d721fcf9c8db54f00776ecda54c628cd" }, "downloads": -1, "filename": "abode-0.1.0.tar.gz", "has_sig": false, "md5_digest": "1819edce08122c0c847fd96c67fe1db2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5590, "upload_time": "2019-08-18T21:26:55", "url": "https://files.pythonhosted.org/packages/95/9c/24a41d28045cdf9bb1fc7feab51bef5305dc1ba63450c10e2e8f3ade8c95/abode-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "4bd10ccc729e56fc6b7537c5f17b0fe4", "sha256": "928ca2ea967eedc1621d838240151c828aeb05335df6281932e5116b08cca387" }, "downloads": -1, "filename": "abode-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "4bd10ccc729e56fc6b7537c5f17b0fe4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9308, "upload_time": "2019-08-18T21:31:02", "url": "https://files.pythonhosted.org/packages/98/3a/1c3cb9cbad124af237fe08887b6b48da76d517822771aa53310addad310c/abode-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9718d6c6c9eb55cb525e1fd65b953ab8", "sha256": "9c67651e39660cf4361dfdd030ded7b21f7c27ed76062ed325dfdcc8cfcd233f" }, "downloads": -1, "filename": "abode-0.1.1.tar.gz", "has_sig": false, "md5_digest": "9718d6c6c9eb55cb525e1fd65b953ab8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6224, "upload_time": "2019-08-18T21:31:03", "url": "https://files.pythonhosted.org/packages/6c/78/381c47a7e3dd1e01daf2a7d4ceee08fb1eb3eaa3478761a4d07f0adff4a2/abode-0.1.1.tar.gz" } ], "0.1.1a0": [ { "comment_text": "", "digests": { "md5": "24f34e8f8cc90e8b5d8bbf8de38c454f", "sha256": "16f5cb90c8119e9f52701fda0190caf50f08ec78e738729910352e659914b754" }, "downloads": -1, "filename": "abode-0.1.1a0-py3-none-any.whl", "has_sig": false, "md5_digest": "24f34e8f8cc90e8b5d8bbf8de38c454f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9336, "upload_time": "2019-08-18T21:38:48", "url": "https://files.pythonhosted.org/packages/f2/39/c6acc9b377159198e4773c171ad1f1e4bc2a4608d1d8d20422bb644a396e/abode-0.1.1a0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5976d67b249f997fe1656d6679e6bb2a", "sha256": "0ec252fced81993e074c00292049ece87700cac1b22e62d13f5f49c142c6f7f2" }, "downloads": -1, "filename": "abode-0.1.1a0.tar.gz", "has_sig": false, "md5_digest": "5976d67b249f997fe1656d6679e6bb2a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6241, "upload_time": "2019-08-18T21:38:50", "url": "https://files.pythonhosted.org/packages/c4/d1/402991268210c5138801cde31467ea9103fbb98febed4519b3d59d70ccaa/abode-0.1.1a0.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "14faa57d91a8e119de2a417b6285b1bb", "sha256": "49a76d6bde2fca12da8657bea0c374252aef78b0a4664d25c221a0a69ad982fd" }, "downloads": -1, "filename": "abode-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "14faa57d91a8e119de2a417b6285b1bb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9311, "upload_time": "2019-08-18T21:42:57", "url": "https://files.pythonhosted.org/packages/a1/20/c5e58ca04ac848f7c3bd34137f0f0e3a744ed93ca69bec13df769946c1e2/abode-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2b53c521ece60dcc933ed824b3bb8f0b", "sha256": "904da668c1f6f3d1ef7f12d7812fd6b6a984929ef53d11704ea9f9f7f444cd45" }, "downloads": -1, "filename": "abode-0.1.2.tar.gz", "has_sig": false, "md5_digest": "2b53c521ece60dcc933ed824b3bb8f0b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6238, "upload_time": "2019-08-18T21:42:59", "url": "https://files.pythonhosted.org/packages/4d/f7/35a45d35c51d953229b8d2b36a75f4891562c361d9a949b65010c9f9f8cc/abode-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "29be369f4902e9c2e5657ba42f9fd4ec", "sha256": "fcd4a4eb30828885df16946a979950f31bb202291492f5bb5c68af563c28b566" }, "downloads": -1, "filename": "abode-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "29be369f4902e9c2e5657ba42f9fd4ec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9717, "upload_time": "2019-08-29T20:00:30", "url": "https://files.pythonhosted.org/packages/b8/94/ee09b56a4eaf653fb799ecb7425364b0bd48a09e0b4b161339ef93bc3172/abode-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1eb68a79c71938bafd655e3aa02e0385", "sha256": "df533dc29fd45222fccfb2866fd41599e73bb4297abb3851c360df5e27f329f6" }, "downloads": -1, "filename": "abode-0.1.3.tar.gz", "has_sig": false, "md5_digest": "1eb68a79c71938bafd655e3aa02e0385", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6326, "upload_time": "2019-08-29T20:00:32", "url": "https://files.pythonhosted.org/packages/1e/bf/9af714a22f55e5620ceaa03ebadf39aba9b3e9cf4e300033b465411c0997/abode-0.1.3.tar.gz" } ], "0.1.3a0": [ { "comment_text": "", "digests": { "md5": "cdbfc2e63af620eb0b08c9af1908e3dc", "sha256": "3b410014718044b9b57080ba408792e5e455c7fe2aca3deea2f30f2218f8252e" }, "downloads": -1, "filename": "abode-0.1.3a0-py3-none-any.whl", "has_sig": false, "md5_digest": "cdbfc2e63af620eb0b08c9af1908e3dc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9751, "upload_time": "2019-08-29T20:38:27", "url": "https://files.pythonhosted.org/packages/f3/79/9874f470ef5afff28402b64a896f3ee99e19f1b027b6eed57a44bc6f559a/abode-0.1.3a0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "171ac7855951c9f1f484e7ea91340fbe", "sha256": "7aacbe2852e17a2946aa8a16fd9ac85b0356e8bc0b8849f8fc7ebb7103003b18" }, "downloads": -1, "filename": "abode-0.1.3a0.tar.gz", "has_sig": false, "md5_digest": "171ac7855951c9f1f484e7ea91340fbe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6359, "upload_time": "2019-08-29T20:38:28", "url": "https://files.pythonhosted.org/packages/bc/92/b642ddba86332c1426e6915795cc9020c31c94debca4d81bab15727db85d/abode-0.1.3a0.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "70a6fb26ee9fceca8e9e27e3ea5b37da", "sha256": "4436fc56c327e12a1048f8d43369b8e1734352069c2d39b1fd1294bd9be90ac7" }, "downloads": -1, "filename": "abode-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "70a6fb26ee9fceca8e9e27e3ea5b37da", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9722, "upload_time": "2019-08-29T20:41:43", "url": "https://files.pythonhosted.org/packages/30/2d/74924b721b9115ddb66df35c73820eb07289c5993e7de69ae28da6e7592f/abode-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4a0ab5bd9ffd2dbe31ae141ec306d027", "sha256": "3009a39ea2b88066d985736c540795c24d4d5dbecfb03a28b65c2a9812119c36" }, "downloads": -1, "filename": "abode-0.1.4.tar.gz", "has_sig": false, "md5_digest": "4a0ab5bd9ffd2dbe31ae141ec306d027", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6359, "upload_time": "2019-08-29T20:41:44", "url": "https://files.pythonhosted.org/packages/8a/79/fd3151472e110447022fd725adcc86973595c5a1e1fea8da91dc79a9dc42/abode-0.1.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "70a6fb26ee9fceca8e9e27e3ea5b37da", "sha256": "4436fc56c327e12a1048f8d43369b8e1734352069c2d39b1fd1294bd9be90ac7" }, "downloads": -1, "filename": "abode-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "70a6fb26ee9fceca8e9e27e3ea5b37da", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9722, "upload_time": "2019-08-29T20:41:43", "url": "https://files.pythonhosted.org/packages/30/2d/74924b721b9115ddb66df35c73820eb07289c5993e7de69ae28da6e7592f/abode-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4a0ab5bd9ffd2dbe31ae141ec306d027", "sha256": "3009a39ea2b88066d985736c540795c24d4d5dbecfb03a28b65c2a9812119c36" }, "downloads": -1, "filename": "abode-0.1.4.tar.gz", "has_sig": false, "md5_digest": "4a0ab5bd9ffd2dbe31ae141ec306d027", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6359, "upload_time": "2019-08-29T20:41:44", "url": "https://files.pythonhosted.org/packages/8a/79/fd3151472e110447022fd725adcc86973595c5a1e1fea8da91dc79a9dc42/abode-0.1.4.tar.gz" } ] }