'How do install packages from a local python package index?
https://www.python.org/dev/peps/pep-0503 and https://pip.pypa.io/en/stable/reference/pip_wheel/#cmdoption-i allude to being able to install python packages from a local directory, but it's not quite explicitly clear what this looks like in practice.
Do I use the same index.html files in my local directories? What does the argument to the --extra-index-url look like for a local directory?
Solution 1:[1]
If you have a directory of distributions you want searched by pip, you may simply include the path to the directory:
pip install --extra-index-url=file:///path/to/wheelhouse somepackage
The /path/to/wheelhouse
should to be structured like a simple repository, see PEP 503 – Simple Repository API. It is not necessary to run a webserver, serving from the filesystem is okay.
You could use --index-url
instead of --extra-index-url
if you don't want the remote PyPI searched at all. Note it's also possible to add --extra-index-url
and/or --index-url
at the top of your requirements.txt
file.
Using pip
, you can also install a distribution directly from a local file.
For example, to install the copyingmock distribution:
$ curl https://pypi.python.org/packages/d9/26/5ae8945356634c87cdf099bd7cee57799df46798af90ae5ccb03961c6359/copyingmock-0.1-py2.py3-none-any.whl > copyingmock-0.1-py2.py3-none-any.whl
$ pip install ./copyingmock-0.1-py2.py3-none-any.whl
I've shown an example with a binary distribution, but the same should work for source distributions (.tar.gz).
Solution 2:[2]
Let's say you have 2 packages you want to install from locally: abc-xyz
and foo
, and you have your corresponding package files abc-xzy-1.2.3.tar.gz
and foo-1.0.0.tar.gz
.
We'll put your local pypi directory at /my_local_pypi/simple
Your directory structure will look like:
/my_local_pypi/simple
index.html
- abc-xyz/
index.html
abc-xyz-1.2.3.tar.gz
- foo/
index.html
foo-1.0.0.tar.gz
The root index.html
needs <a href></a>
anchor entries for each package, so should look like:
$ cat /my_local_pypi/simple/index.html
<!DOCTYPE html><html><body>
<a href="abc-xyz">abc-xyz></a></br>
<a href="foo">foo</a></br>
</body></html>
Then each $package/index.html
needs an <a href></a>
anchor pointing to the actual package file, so they should look like:
$ cat /my_local_pypi/simple/abc-xyz/index.html
<!DOCTYPE html><html><body>
<a href="abc-xyz-1.2.3.tar.gz">abc-xyz-1.2.3.tar.gz</a></br>
</body></html>
$ cat /my_local_pypi/simple/foo/index.html
<!DOCTYPE html><html><body>
<a href="foo-1.0.0.tar.gz">foo-1.0.0.tar.gz</a></br>
</body></html>
Then in your requirements.txt
, you can do:
$ cat requirements.txt
--extra-index-url file:///my_local_pypi/simple/
abc-xyz==1.2.3
foo==1.0.0
And then you should be good to go: pip install -r requirements.txt
See also the piprepo project, which does a pretty good job of generating the local directory structure needed.
Solution 3:[3]
You won't have to use any index.html
files.
Running the following should suffice:
pip install "path/to/file.whl"
This will install from local wheel file.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | |
Solution 3 | mmenschig |