{ "info": { "author": "Chad Smith", "author_email": "grassfedcode@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8" ], "description": "# **pythonloc**: Drop-in Python replacement that imports packages from local directory\n\n

\n\n

\n\n\n\n\n**pythonloc** is a drop in replacement for `python` and `pip` that automatically recognizes a `__pypackages__` directory and prefers importing packages installed in this location over user or global site-packages. If you are familiar with node, `__pypackages__` works similarly to `node_modules`.\n\nSo instead of running `python` you run `pythonloc` and the `__pypackages__` path will automatically be searched first for packages. And instead of running `pip` you run `piploc` and it will install/uninstall from `__pypackages__`.\n\nThis is an alternative to using Virtual Environments.\n\nThis is a Python implementation of [PEP 582](https://www.python.org/dev/peps/pep-0582/), \"Python local packages directory\". The goal of pythonloc is to make an accessible tool while discussion takes place around adding this functionality to CPython itself. If you prefer, you can [build your own CPython](https://github.com/kushaldas/cpython/tree/pypackages) with these changes instead of using `pythonloc`.\n\n**Please note that PEP 582 has not been accepted. It may or not be accepted in the long term. `pythonloc` is experimental and its API may change in the future.**\n\n## Testimonials\n\n*Featured on [episode #117](https://pythonbytes.fm/episodes/show/117/is-this-the-end-of-python-virtual-environments) of the Python bytes podcast.*\n\n\"Chad has been working and writing some exciting python tools and articles in the packaging/pip space.\"\n\n\u2014 [Jeff Triplett](https://twitter.com/webology/status/1092856644512505856), Python Software Foundation Director\n\n\"I\u2019m very enthusiastic about how `__pypackages__` could help simplify and streamline the Python dependencies workflow. Well done on bringing an early prototype implementation for people to test!\"\n\n\u2014 Florimond Manca, Creator of [Bocadillo Project](https://github.com/bocadilloproject)\n\n## System Requirements\n* Python 2.7+\n* pip\n\n\n## Installation: What's in the box?\nAfter installing with\n```\npip install --user pythonloc\n```\nor\n```\npython3 -m pip install --user pythonloc\n```\nyou will have four CLI tools available to you: **pythonloc**, **piploc**, **pipx**, and **pipfreezeloc**.\n\n### pythonloc\nShort for \"python local\", it is a drop-in replacement for python with one important difference: the local directory `__pypackages__//lib` is added to the front of `sys.path`. `` is the Python version, something like `3.7`. All arguments are forwarded to `python`.\n\nSo instead of running\n```\npython ...\n```\n\nyou would run\n\n```\npythonloc ...\n```\n\nIf PEP 582 is adopted, `python` itself will have this behavior.\n\n### piploc\nShort for \"pip local\", it invokes pip with the same `sys.path` as `pythonloc`. If installing a package, the target installation directory is modified to be `__pypackages__` instead of the global `site-packages`.\n\nIf `__pypackages__` directory does not exist it will be created.\n\nAll arguments are forwarded to `pip`.\n\nSo instead of running\n```\npip ...\n```\n\nyou would run\n\n```\npiploc ...\n```\n\nIf PEP 582 is adopted, I think `pip` should default to working in the appropriate `__pypackages__` directory. A flag can be added to install to site-packages, if desired.\n\n### pipx\n*Note: pipx is included with pythonloc for Python 3.6+ only.*\n\nInstalling packages that have so called \"entry points\" to `__pypackages__` presents a problem. The entry points, or \"binaries\", are no longer available on your $PATH as they would be if you installed in a virtual environment or to your system. These binaries are massively popular and useful. Examples of binaries are `black`, `pytest`, `tox`, `flake8`, `mypy`, `poetry`, and `pipenv` (and indeed `pythonloc` itself).\n\n`pipx` is a binary installer and runner for Python that, when run, searches for a binary in the appropriate `__pypackages__` location and runs it. If you are familiar with JavaScript's [`npx`](https://www.npmjs.com/package/npx), it's similar to that.\n\nSo instead of running\n```\nBINARY [BINARY ARGS]\n```\nyou would run\n```\npipx run BINARY [BINARY ARGS]\n```\nIf not found, pipx will install and run it from a temporary directory. If you require the binary to be found in the `__pypackages__` directory, you can run\n```\npipx run --pypackages BINARY [BINARY ARGS]\n```\nIf the binary is not found, and error will be presented.\n\n**Note**: When installing a new package to an existing `__pypackages__` directory, the entry points will not be created in `.../3.6/lib/bin`, for example, if something is already there. To do that, you need to run `piploc install -U PACKAGE`. When you do that, the entire contents of the directory will be replaced. Fixing this would require a modification to `pip` itself.\n\nIf PEP 582 is adopted, `pipx` will be a good companion tool to run binaries.\n\n### pipfreezeloc\nRunning `pip freeze` presents a problem because it shows all installed python packages: those in `site-packages` as well as in `__pypackages__`. You likely only want to output the packages installed to `__pypackages__` and that is exactly what `pipfreezeloc` does.\n\nIt is the equivalent of `pip freeze` but only outputs packages in `__pypackages__`. This is required because there is no built-in way to do this with standard pip. For example, the command `pip freeze --target __pypackages__` does not exist.\n\nNo arguments are handled with `pipfreezeloc`.\n\nSo instead of running\n```\npip freeze > requirements.txt\n```\n\nyou would run\n\n```\npipfreezeloc > requirements.txt\n```\n\nIf PEP 582 is adopted, a more robust solution to freezing the state of `__pypackages__` should be created.\n\n## Installing from requirements.txt/Lockfiles\nThis works just like it does in pip. You just need a `requirements.txt` file to install from.\n\n### Installing from `requirements.txt`\n```\npiploc install -r requirements.txt\npythonloc \n```\n\n### Installing from `poetry.lock`\npip cannot read poetry.lock files, so you'll have to generate a requirements.txt file.\n```\npoetry run pip freeze > requirements.txt\npiploc install -r requirements.txt\npythonloc \n```\n\nThere may be an `export` command coming to `poetry` but it hasn't landed yet. See https://github.com/sdispater/poetry/pull/675.\n\n### Installing from `Pipfile.lock`\npip cannot read `Pipfile`s yet, only pipenv can. So you will need to generate requirements.txt using pipenv.\n```\npipenv lock --requirements\npipenv lock --requirements --dev\npiploc install -r requirements.txt\npythonloc \n```\n\nIn the long term tools will be able to install directly to `__pypackages__` or piploc will be able to read various lockfile formats.\n\n\n## Examples\n\n### Script\n\n\n```python\n# myapp.py\nimport requests\nprint(requests)\n```\n\n```bash\n> piploc install requests\nInstalling collected packages: urllib3, certifi, chardet, idna, requests\nSuccessfully installed certifi-2018.11.29 chardet-3.0.4 idna-2.8 requests-2.21.0 urllib3-1.24.1\n\n> pipfreezeloc\nrequests==2.21.0\n\n> pythonloc myapp.py # works!\n\n```\n\n### CLI\n\nYou can run any python command with pythonloc and it will just run python under the hood:\n```bash\n> pythonloc --help\n> pythonloc --version\n```\n\nAnother example showing how imports work:\n```bash\n> ls\n\n> pythonloc -c \"import requests; print(requests)\"\nTraceback (most recent call last):\n File \"\", line 1, in \nModuleNotFoundError: No module named 'requests'\n\n> piploc install requests # installs to __pypackages__/3.6/lib/requests\nInstalling collected packages: urllib3, certifi, chardet, idna, requests\nSuccessfully installed certifi-2018.11.29 chardet-3.0.4 idna-2.8 requests-2.21.0 urllib3-1.24.1\n\n> pythonloc -c \"import requests; print(requests)\" # requests is now found\n\n\n> piploc uninstall requests # uninstalls from __pypackages__/3.6/lib/requests\nSuccessfully uninstalled requests-2.21.0\n```\n\n## Entry Points / Binaries\n```\n> piploc install cowsay\nCollecting cowsay\n Using cached https://files.pythonhosted.org/packages/e7/e7/e93f311adf63ac8936beb962223771b1ab61227ae3d9ec86e8d9f8f9da1c/cowsay-2.0-py2.py3-none-any.whl\nInstalling collected packages: cowsay\nSuccessfully installed cowsay-2.0\n\n> pipx run cowsay moooo from local __pypackages__!\n ________________________________\n< moooo from local __pypackages__! >\n ================================\n \\\n \\\n ^__^\n (oo)\\_______\n (__)\\ )\\/ ||----w |\n || ||\n\n\n```\n\n## Downsides?\n\nWhile this PEP is pretty exciting, there are a some things it doesn't solve.\n\n* OS-dependent packages: The directory structure in `__pypackages__` is namespaced on python version, so packages for Python 3.6 will not mix with 3.7, which is great. But sometimes packages install differently for different OS's, so Windows may not match mac, etc.\n* site-packages: This PEP first looks to `__pypackages__` but will fall back to looking in `site-packages`. This is not entirely hermetic and could lead to some confusion around which packages are being used. I would prefer the default search path be **only** `__pypackages__` and nothing else.\n* perceived downside -- bloat: Many have brought this up in various forums, comparing it to `node_modules`, but I don't think it applies here. For one, the same if not more content is installed into a virtual environment, so this just moves it into a local directory. No additional bloat. In fact, it is more obvious and can be deleted because it's not hidden away in a virtual env directory. But more importantly, I think the assumption that it is bloated or will be abused stems from JavaScript's ecosystem. JavaScript has a notoriously limited standard library, and developers need to reach for third party packages more often. In addition, the JavaScript community heavily relies on many plugins and transpilation. Python does not. I do not find the bloat argument convincing.\n* Some pip installation idiosyncracies. For example, `pip install` with `--target` will wipe out content in the `lib/bin` directory when the `-U` flag is passed, but not put anything there when it's not passed.\n\n## FAQ\n\n### How is this different from a virtual environment?\n* A virtual environment may or may not include system packages, whereas `pythonloc` will first look for packages in `.`, then `__pypackages__`, then in other locations such as user or site-packages.\n* `pythonloc` does not require activation or deactivation\n* `pythonloc` only looks for a local directory called `__pypackages__`. On the other hand, virtual environment activation modifies your `PATH` so you can access virtual environment packages no matter which directory you're in.\n\n### How does it work?\nIt's quite simple and clocks in at less than 100 lines of code. It uses features already built into Python and pip.\n\nAll it does is provide a slight level of indirection when invoking Python and pip. It modifies the `PYTHONPATH` environment variable when running Python to include `__pypackages__`.\n\nIf you consult the output of `python --help`, you'll see this:\n> PYTHONPATH is a ':'-separated list of directories prefixed to the default module search path. The result is sys.path.\n\npythonloc is an alias for `PYTHONPATH=.:__pypackages__//lib:$PYTHONPATH python PYTHONARGS`\n\nTo install packages to the `__pypackages__` directory, it uses pip and runs\n\n```bash\nPYTHONPATH=.:__pypackages__//lib:$PYTHONPATH python -m pip PIPARGS\n```\nwhere `PIPARGS` are whatever arguments you pass it, such as `piploc install requests`.\n\nIt will insert the arguments `--target __pypackages__` if you are installing a package.\n\n### What actually gets put in `__pypackages__`?\nThe installed packages go there. This includes their source code, for example the `requests` directory below. metadata about the package is stored in the `*.dist-info` directories.\n\nIf you want to modify or debug the source of an installed package, it's very easy to do so. Just open the appropriate file in `__pypackages__` and edit away!\n```bash\n> piploc install requests\nInstalling collected packages: urllib3, certifi, chardet, idna, requests\nSuccessfully installed certifi-2018.11.29 chardet-3.0.4 idna-2.8 requests-2.21.0 urllib3-1.24.1\n\n\n> ls # note __pypackages__ was created\n__pypackages__\n\n> ls __pypackages__/3.6/lib\nbin idna-2.8.dist-info\ncertifi requests\ncertifi-2018.11.29.dist-info requests-2.21.0.dist-info\nchardet urllib3\nchardet-3.0.4.dist-info urllib3-1.24.1.dist-info\nidna\n```\n### How do I uninstall packages from `__pypackages__`?\n`piploc` will automatically add `__pypackages__` to `$PYTHONPATH`, so\n\n```\npiploc uninstall PACKAGE\n```\n\nwill work.\n\nIf you get the error\n\n> Not uninstalling PACKAGE at ..., outside environment ...\n\nthen run `deactivate` to make sure you are not using a virtual environment, then try again.\n\n### Can I make `python` do this instead of calling `pythonloc`?\nAn easy way to get this behavior is to create a symlink in your local directory\n```\nln -s `which pythonloc` python\nln -s `which piploc` pip\n```\nThen run them with\n```\n./python\n./pip\n```\nOtherwise you'll have to build CPython yourself with the [reference implementation](https://github.com/kushaldas/cpython/tree/pypackages) on GitHub.\n\n### Why not use the reference implementation of PEP 582?\nThere is more overhead involved in building and distributing a custom CPython build than installing a pip package.\n\nYou are encouraged to check it out if you are interested though, it's pretty cool!\n\nIf it gets accepted and added to CPython then `pythonloc` may not be needed anymore.\n\n* [PEP 582](https://www.python.org/dev/peps/pep-0582/)\n* [reference CPython implementation](https://github.com/kushaldas/cpython/tree/pypackages) on GitHub\n\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/pipxproject/pythonloc", "keywords": "", "license": "License :: OSI Approved :: MIT License", "maintainer": "", "maintainer_email": "", "name": "pythonloc", "package_url": "https://pypi.org/project/pythonloc/", "platform": "", "project_url": "https://pypi.org/project/pythonloc/", "project_urls": { "Homepage": "https://github.com/pipxproject/pythonloc" }, "release_url": "https://pypi.org/project/pythonloc/0.1.2.1/", "requires_dist": [ "pipx (>=0.12.2.0) ; python_version >= \"3.6\"" ], "requires_python": ">=2.7", "summary": "Run Python using packages from local directory __pypackages__", "version": "0.1.2.1" }, "last_serial": 5233741, "releases": { "0.0.0.1": [ { "comment_text": "", "digests": { "md5": "a49d2f108bda45010cd433e3fbc0ec63", "sha256": "ea811911e025534a14a44431dba39f71388f4abd55a35aaa5dc344e088c03e89" }, "downloads": -1, "filename": "pythonloc-0.0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "a49d2f108bda45010cd433e3fbc0ec63", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 5792, "upload_time": "2019-02-02T18:50:08", "url": "https://files.pythonhosted.org/packages/4d/be/c93a4956838d1ef38a6b0dad0a173930e76adf79f806e9a41e3a22ab229b/pythonloc-0.0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "766c81a79fb1be9949589850b5313463", "sha256": "0ebdbbc60d1f857c5841584027341233f2c5841a20ab833adfe527e09eeb099e" }, "downloads": -1, "filename": "pythonloc-0.0.0.1.tar.gz", "has_sig": false, "md5_digest": "766c81a79fb1be9949589850b5313463", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 6148, "upload_time": "2019-02-02T18:50:10", "url": "https://files.pythonhosted.org/packages/6c/2f/f0f3de8c5ad694c086da59bcfd9f4e8569d686f826e432b43c94e9b0d9ea/pythonloc-0.0.0.1.tar.gz" } ], "0.0.0.2": [ { "comment_text": "", "digests": { "md5": "ea576cda4166028855d75e5f49c61204", "sha256": "e867a6a8a4b1b61af7f04759612e3c6f70c0abc6d6ffb1ca3fabb2d201adfab3" }, "downloads": -1, "filename": "pythonloc-0.0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ea576cda4166028855d75e5f49c61204", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 6048, "upload_time": "2019-02-03T01:41:06", "url": "https://files.pythonhosted.org/packages/6c/ed/1d481389c6999e2de9c9f7f8fd5a9211f275d9048bcd28fc79301b618477/pythonloc-0.0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "779a8b0e198d4965876409d30b8ff501", "sha256": "01b9804acd2e62660dc678e73e9585e5dfdda86cb2e4c40731d80780e4bccd64" }, "downloads": -1, "filename": "pythonloc-0.0.0.2.tar.gz", "has_sig": false, "md5_digest": "779a8b0e198d4965876409d30b8ff501", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 6389, "upload_time": "2019-02-03T01:41:08", "url": "https://files.pythonhosted.org/packages/41/d0/8873dd05c6bbd6a9fdd5dcc99fd3f58fe024b1b9e69aca5a41ee71bd892b/pythonloc-0.0.0.2.tar.gz" } ], "0.0.0.3": [ { "comment_text": "", "digests": { "md5": "56bc38b7a627fff386409a0e3b9ba2ca", "sha256": "7797973ce1b382d11fb2d8387b528882b0377a1b3eec9d1c05726ce0f6b32d10" }, "downloads": -1, "filename": "pythonloc-0.0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "56bc38b7a627fff386409a0e3b9ba2ca", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 6366, "upload_time": "2019-02-03T22:11:33", "url": "https://files.pythonhosted.org/packages/de/94/78884a6fd0ab54eed8d9b2729a8b1f9cd83b8db2b35d23235d637c7d62f3/pythonloc-0.0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "997365a6adccd599c2e608f7344e8a5e", "sha256": "702854f73466d012154693eca6e33a5424c8558d234466549375554138edd222" }, "downloads": -1, "filename": "pythonloc-0.0.0.3.tar.gz", "has_sig": false, "md5_digest": "997365a6adccd599c2e608f7344e8a5e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 6734, "upload_time": "2019-02-03T22:11:35", "url": "https://files.pythonhosted.org/packages/d9/ae/547017d4a110b7146d834441995169b08b2acab3f8bd8e84612973f28628/pythonloc-0.0.0.3.tar.gz" } ], "0.1.0.0": [ { "comment_text": "", "digests": { "md5": "7aca84f54045f76837768bc04d13eec8", "sha256": "d2e148125dba4cad444bd22f34a1cfb7d65528fad5605f2d0554d7f26b1340d6" }, "downloads": -1, "filename": "pythonloc-0.1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "7aca84f54045f76837768bc04d13eec8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 7079, "upload_time": "2019-02-06T03:50:33", "url": "https://files.pythonhosted.org/packages/cf/71/d4390a5d5591bfad95c7fcbe744b3c56441950da3531db42a85a3004d1b7/pythonloc-0.1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "09be809d5d728c658db74402add47dbf", "sha256": "1ddb16c624ea606d9cf956105f815f93d13d6904f32c1f4c541cb36390b4e0c3" }, "downloads": -1, "filename": "pythonloc-0.1.0.0.tar.gz", "has_sig": false, "md5_digest": "09be809d5d728c658db74402add47dbf", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 7499, "upload_time": "2019-02-06T03:50:35", "url": "https://files.pythonhosted.org/packages/36/23/db341a50d87ba6fdd50e501377171488a18b6cf0ca981365e251c8049000/pythonloc-0.1.0.0.tar.gz" } ], "0.1.1.0": [ { "comment_text": "", "digests": { "md5": "a6e9b95c664a48f8e2f449993b2320ab", "sha256": "5920da6b68c0566e4695f3adadc99f427a61c022d17948311b6e4a802f7df909" }, "downloads": -1, "filename": "pythonloc-0.1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "a6e9b95c664a48f8e2f449993b2320ab", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 7265, "upload_time": "2019-02-08T17:24:58", "url": "https://files.pythonhosted.org/packages/6f/ad/85aba8816e9b37c2a8e034dbb1f3a659eba967f25dfaedf8d8932d5d9fd6/pythonloc-0.1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d490df59c027135f904e55fb188d24c3", "sha256": "f05fc20af1b0b3be730b2c41ca2768d1fdf64aae3a4cca6f1177df5d55bb9288" }, "downloads": -1, "filename": "pythonloc-0.1.1.0.tar.gz", "has_sig": false, "md5_digest": "d490df59c027135f904e55fb188d24c3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 7526, "upload_time": "2019-02-08T17:24:59", "url": "https://files.pythonhosted.org/packages/3f/31/6190c37c0c728789363d79fe6bed204307f7e819dde56cd6d267641a9561/pythonloc-0.1.1.0.tar.gz" } ], "0.1.1.1": [ { "comment_text": "", "digests": { "md5": "80c76b737f84c1715d04a2477f12abef", "sha256": "05bee2efa4b94ae3d43beb317577cb6035f3c1c83e172eec10919dd7125c8bf8" }, "downloads": -1, "filename": "pythonloc-0.1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "80c76b737f84c1715d04a2477f12abef", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 7257, "upload_time": "2019-02-08T17:28:06", "url": "https://files.pythonhosted.org/packages/02/02/88be53abb689d9570cd391db8c6bfe2137af2aeb63315fd81c04ad7d8911/pythonloc-0.1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "485cc64f4921147f3bf2c6fc54fc4dad", "sha256": "8ef34b519b22c1b775d243a0f625fab701f93d59b421184ae73ec128668d65b8" }, "downloads": -1, "filename": "pythonloc-0.1.1.1.tar.gz", "has_sig": false, "md5_digest": "485cc64f4921147f3bf2c6fc54fc4dad", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 7532, "upload_time": "2019-02-08T17:28:07", "url": "https://files.pythonhosted.org/packages/e2/29/6f4001a4f12d3edf24f360fd43e6e72a2e1869058419046bc816275a830e/pythonloc-0.1.1.1.tar.gz" } ], "0.1.1.2": [ { "comment_text": "", "digests": { "md5": "4eb433ea450285c381daeb46b1e35b4b", "sha256": "72737f33ced923d53e106ef4d6dc44c3b0116791a20254eae35c590b31819824" }, "downloads": -1, "filename": "pythonloc-0.1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "4eb433ea450285c381daeb46b1e35b4b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 8132, "upload_time": "2019-02-16T00:58:25", "url": "https://files.pythonhosted.org/packages/ec/68/da43b5a35b8eb4f09d3022ec7fc1bd315b89fabc10255075bb697f182a9f/pythonloc-0.1.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "25ad31eb73d933128a1c069d389c9cf1", "sha256": "fa442fb438720777e6586fee15766c31906e7b89fda8d7ccde251151382a2d28" }, "downloads": -1, "filename": "pythonloc-0.1.1.2.tar.gz", "has_sig": false, "md5_digest": "25ad31eb73d933128a1c069d389c9cf1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 8549, "upload_time": "2019-02-16T00:58:27", "url": "https://files.pythonhosted.org/packages/39/e9/672c8fa42c92e297a1f4f14f2dc776ae26032d846a45e7429678e8e9d59a/pythonloc-0.1.1.2.tar.gz" } ], "0.1.2.0": [ { "comment_text": "", "digests": { "md5": "9371aeb9279981155f17e2250084b2f5", "sha256": "a32db3b975e7da45512bfe35811083a9c97f0df9682b5b1ccd475c50e826b230" }, "downloads": -1, "filename": "pythonloc-0.1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9371aeb9279981155f17e2250084b2f5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 8973, "upload_time": "2019-02-19T06:29:04", "url": "https://files.pythonhosted.org/packages/24/a3/e69c14577a3e573475b9c65b164eabcf276af7281ad115d8cb7d36a754c9/pythonloc-0.1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b86ce90fd181b7568c83bebc5ae5450f", "sha256": "86ffe39be30e0a193831b62148ef2ba8c93112c6133689b50b24b45b7046b5c4" }, "downloads": -1, "filename": "pythonloc-0.1.2.0.tar.gz", "has_sig": false, "md5_digest": "b86ce90fd181b7568c83bebc5ae5450f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 9693, "upload_time": "2019-02-19T06:29:06", "url": "https://files.pythonhosted.org/packages/da/11/b74c7c1bbbadc3da18ab162e0cdcd06177dcf25583a39e5cecab84859c6e/pythonloc-0.1.2.0.tar.gz" } ], "0.1.2.1": [ { "comment_text": "", "digests": { "md5": "40040a4f04c231681fe2df5af4af31d4", "sha256": "026e507cb9d1661e54b6895afbe5f42ed4cc8fe7af114c6c9a9e4f041acadd65" }, "downloads": -1, "filename": "pythonloc-0.1.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "40040a4f04c231681fe2df5af4af31d4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 9004, "upload_time": "2019-05-06T15:50:31", "url": "https://files.pythonhosted.org/packages/9d/41/0765b1298c4ffde2c681bc31a6e3413a81010b9754a5630710c3fcd4fb27/pythonloc-0.1.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9157fba6cfad0c7caee7722f932ddaf1", "sha256": "05d8668bfc4e51c8a867c364422fd153959725ba304a848f93647e9c693f3a8a" }, "downloads": -1, "filename": "pythonloc-0.1.2.1.tar.gz", "has_sig": false, "md5_digest": "9157fba6cfad0c7caee7722f932ddaf1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 9723, "upload_time": "2019-05-06T15:50:32", "url": "https://files.pythonhosted.org/packages/d6/4a/dccd9462867dcb7a0b3c66741c7ae28910ce1a72623d58aaf613309da107/pythonloc-0.1.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "40040a4f04c231681fe2df5af4af31d4", "sha256": "026e507cb9d1661e54b6895afbe5f42ed4cc8fe7af114c6c9a9e4f041acadd65" }, "downloads": -1, "filename": "pythonloc-0.1.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "40040a4f04c231681fe2df5af4af31d4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7", "size": 9004, "upload_time": "2019-05-06T15:50:31", "url": "https://files.pythonhosted.org/packages/9d/41/0765b1298c4ffde2c681bc31a6e3413a81010b9754a5630710c3fcd4fb27/pythonloc-0.1.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9157fba6cfad0c7caee7722f932ddaf1", "sha256": "05d8668bfc4e51c8a867c364422fd153959725ba304a848f93647e9c693f3a8a" }, "downloads": -1, "filename": "pythonloc-0.1.2.1.tar.gz", "has_sig": false, "md5_digest": "9157fba6cfad0c7caee7722f932ddaf1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7", "size": 9723, "upload_time": "2019-05-06T15:50:32", "url": "https://files.pythonhosted.org/packages/d6/4a/dccd9462867dcb7a0b3c66741c7ae28910ce1a72623d58aaf613309da107/pythonloc-0.1.2.1.tar.gz" } ] }