Reputation: 9743
Is it possible to install packages using pip from the local filesystem?
I have run python setup.py sdist
for my package, which has created the appropriate tar.gz file. This file is stored on my system at /srv/pkg/mypackage/mypackage-0.1.0.tar.gz
.
Now in a virtual environment I would like to install packages either coming from pypi or from the specific local location /srv/pkg
.
Is this possible?
PS
I know that I can specify pip install /srv/pkg/mypackage/mypackage-0.1.0.tar.gz
. That will work, but I am talking about using the /srv/pkg
location as another place for pip to search if I typed pip install mypackage
.
Upvotes: 556
Views: 899020
Reputation: 1660
One more useful flag: --no-build-isolation
. It helped me, when I tried to install from source without internet:
pip install -e . --disable-pip-version-check --no-index --find-links= ...
there was an error - not found setuptools
, thow, setuptools was installed, and --no-build-isolation
mentioned here: pip says version 40.8.0 of setuptools does not satisfy requirement of setuptools>=40.8.0 resolved the issue.
Upvotes: 0
Reputation: 4783
From the installing-packages page you can simply run the following command, where /srv/pkg/mypackage is the directory containing the setup.py file.
pip install /srv/pkg/mypackage
Additionally1, you can install it from the archive file.
pip install ./mypackage-1.0.4.tar.gz
1 Although noted in the question, due to its popularity, it is also included.
Upvotes: 129
Reputation: 1
Just add directory on pip command
pip install mypackage file:/location/in/disk/mypackagename.filetype
Upvotes: -3
Reputation: 31
What you need is --find-links
of pip install.
-f, --find-links If a url or path to an html file, then parse for links to archives. If a local path or file:// url that's a directory, then look for archives in the directory listing.
In my case, after python -m build
, tar.gz package (and whl
file) are generated in ./dist
directory.
pip install --no-index -f ./dist YOUR_PACKAGE_NAME
Any tar.gz python package in ./dist
can be installed by this way.
But if your package has dependencies, this command will prompt error.
To solve this, you can either pip install
those deps from official pypi source, then add --no-deps
like this
pip install --no-index --no-deps -f ./dist YOUR_PACKAGE_NAME
or copy your deps packages to ./dist directory.
Upvotes: 3
Reputation: 1256
In my case, it was because this library depended on another local library, which I had not yet installed. Installing the dependency with pip, and then the dependent library, solved the issue.
Upvotes: 1
Reputation: 83758
I am pretty sure that what you are looking for is called --find-links
option.
You can do
pip install mypackage --no-index --find-links file:///srv/pkg/mypackage
Upvotes: 244
Reputation: 29453
To install only from local you need 2 options:
--find-links
: where to look for dependencies. There is no need for the file://
prefix mentioned by others.--no-index
: do not look in pypi indexes for missing dependencies (dependencies not installed and not in the --find-links
path). So you could run from any folder the following:
pip install --no-index --find-links /srv/pkg /path/to/mypackage-0.1.0.tar.gz
If your mypackage is setup properly, it will list all its dependencies, and if you used pip download to download the cascade of dependencies (ie dependencies of depencies etc), everything will work.
If you want to use the pypi index if it is accessible, but fallback to local wheels if not, you can remove --no-index
and add --retries 0
. You will see pip pause for a bit while it is try to check pypi for a missing dependency (one not installed) and when it finds it cannot reach it, will fall back to local. There does not seem to be a way to tell pip to "look for local ones first, then the index".
Upvotes: 15
Reputation: 12445
I've been trying to achieve something really simple and failed miserably, probably I'm stupid.
Anyway, if you have a script/Dockerfile
which download a python package zip file (e.g. from GitHub) and you then want to install it you can use the file:///
prefix to install it as shown in the following example:
$ wget https://example.com/mypackage.zip
$ echo "${MYPACKAGE_MD5} mypackage.zip" | md5sum --check -
$ pip install file:///.mypackage.zip
NOTE: I know you could install the package straight away using pip install https://example.com/mypackage.zip
but in my case I wanted to verify the checksum (never paranoid enough) and I failed miserably when trying to use the various options that pip provides/the #md5
fragment.
It's been surprisingly frustrating to do something so simple directly with pip
. I just wanted to pass a checksum and have pip
verify that the zip was matching before installing it.
I was probably doing something very stupid but in the end I gave up and opted for this. I hope it helps others trying to do something similar.
Upvotes: 0
Reputation: 280
Assuming you have virtualenv and a requirements.txt
file, then you can define inside this file where to get the packages:
# Published pypi packages
PyJWT==1.6.4
email_validator==1.0.3
# Remote GIT repo package, this will install as django-bootstrap-themes
git+https://github.com/marquicus/django-bootstrap-themes#egg=django-bootstrap-themes
# Local GIT repo package, this will install as django-knowledge
git+file:///soft/SANDBOX/python/django/forks/django-knowledge#egg=django-knowledge
Upvotes: 13
Reputation: 8357
Having requirements in requirements.txt
and egg_dir
as a directory
you can build your local cache:
$ pip download -r requirements.txt -d eggs_dir
then, using that "cache" is simple like:
$ pip install -r requirements.txt --find-links=eggs_dir
Upvotes: 12
Reputation: 18972
An option --find-links does the job and it works from requirements.txt
file!
You can put package archives in some folder and take the latest one without changing the requirements file, for example requirements
:
.
└───requirements.txt
└───requirements
├───foo_bar-0.1.5-py2.py3-none-any.whl
├───foo_bar-0.1.6-py2.py3-none-any.whl
├───wiz_bang-0.7-py2.py3-none-any.whl
├───wiz_bang-0.8-py2.py3-none-any.whl
├───base.txt
├───local.txt
└───production.txt
Now in requirements/base.txt
put:
--find-links=requirements
foo_bar
wiz_bang>=0.8
A neat way to update proprietary packages, just drop new one in the folder
In this way you can install packages from local folder
AND pypi
with the same single call: pip install -r requirements/production.txt
PS. See my cookiecutter-djangopackage fork to see how to split requirements and use folder based requirements organization.
Upvotes: 23
Reputation: 4246
I am installing pyfuzzy
but is is not in PyPI; it returns the message: No matching distribution found for pyfuzzy
.
I tried the accepted answer
pip install --no-index --find-links=file:///Users/victor/Downloads/pyfuzzy-0.1.0 pyfuzzy
But it does not work either and returns the following error:
Ignoring indexes: https://pypi.python.org/simple Collecting pyfuzzy Could not find a version that satisfies the requirement pyfuzzy (from versions: ) No matching distribution found for pyfuzzy
At last , I have found a simple good way there: https://pip.pypa.io/en/latest/reference/pip_install.html
Install a particular source archive file.
$ pip install ./downloads/SomePackage-1.0.4.tar.gz
$ pip install http://my.package.repo/SomePackage-1.0.4.zip
So the following command worked for me:
pip install ../pyfuzzy-0.1.0.tar.gz.
Hope it can help you.
Upvotes: 61
Reputation: 1417
This is the solution that I ended up using:
import pip
def install(package):
# Debugging
# pip.main(["install", "--pre", "--upgrade", "--no-index",
# "--find-links=.", package, "--log-file", "log.txt", "-vv"])
pip.main(["install", "--upgrade", "--no-index", "--find-links=.", package])
if __name__ == "__main__":
install("mypackagename")
raw_input("Press Enter to Exit...\n")
I pieced this together from pip install examples as well as from Rikard's answer on another question. The "--pre" argument lets you install non-production versions. The "--no-index" argument avoids searching the PyPI indexes. The "--find-links=." argument searches in the local folder (this can be relative or absolute). I used the "--log-file", "log.txt", and "-vv" arguments for debugging. The "--upgrade" argument lets you install newer versions over older ones.
I also found a good way to uninstall them. This is useful when you have several different Python environments. It's the same basic format, just using "uninstall" instead of "install", with a safety measure to prevent unintended uninstalls:
import pip
def uninstall(package):
response = raw_input("Uninstall '%s'? [y/n]:\n" % package)
if "y" in response.lower():
# Debugging
# pip.main(["uninstall", package, "-vv"])
pip.main(["uninstall", package])
pass
if __name__ == "__main__":
uninstall("mypackagename")
raw_input("Press Enter to Exit...\n")
The local folder contains these files: install.py, uninstall.py, mypackagename-1.0.zip
Upvotes: 26
Reputation: 7952
What about::
pip install --help
...
-e, --editable <path/url> Install a project in editable mode (i.e. setuptools
"develop mode") from a local project path or a VCS url.
eg, pip install -e /srv/pkg
where /srv/pkg is the top-level directory where 'setup.py' can be found.
Upvotes: 610