130

I have to download a git python repo and install since the pypi version is not updated.

Normally I would do this:

pip install mypackage
pip install mypackage[redis]

Now I have the repo cloned in the following folder:

/opt/mypackage

So how do I install the below while ensuring that I use the local version, not the pypi version.

pip --flag /opt/mypackage install mypackage
pip --flag /opt/mypackage install mypackage[redis]

There are the pip flags available and I don't see how to accomplish :

Commands:
  install                     Install packages.
  uninstall                   Uninstall packages.
  freeze                      Output installed packages in requirements format.
  list                        List installed packages.
  show                        Show information about installed packages.
  search                      Search PyPI for packages.
  wheel                       Build wheels from your requirements.
  help                        Show help for commands.

General Options:
  -h, --help                  Show help.
  --isolated                  Run pip in an isolated mode, ignoring environment variables and user configuration.
  -v, --verbose               Give more output. Option is additive, and can be used up to 3 times.
  -V, --version               Show version and exit.
  -q, --quiet                 Give less output.
  --log <path>                Path to a verbose appending log.
  --proxy <proxy>             Specify a proxy in the form [user:passwd@]proxy.server:port.
  --retries <retries>         Maximum number of retries each connection should attempt (default 5 times).
  --timeout <sec>             Set the socket timeout (default 15 seconds).
  --exists-action <action>    Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup.
  --trusted-host <hostname>   Mark this host as trusted, even though it does not have valid or any HTTPS.
  --cert <path>               Path to alternate CA bundle.
  --client-cert <path>        Path to SSL client certificate, a single file containing the private key and the certificate in PEM format.
  --cache-dir <dir>           Store the cache data in <dir>.
  --no-cache-dir              Disable the cache.
  --disable-pip-version-check
MattDMo
  • 100,794
  • 21
  • 241
  • 231
Tampa
  • 75,446
  • 119
  • 278
  • 425

3 Answers3

191

All you need to do is run

pip install /opt/mypackage

and pip will search /opt/mypackage for a setup.py or pyproject.toml, build a wheel, then install it.

The problem with using the -e flag for pip install as suggested in the comments and this answer is that this requires that the original source directory stay in place for as long as you want to use the module. It's great if you're a developer working on the source, but if you're just trying to install a package, it's the wrong choice.

Alternatively, you don't even need to download the repo from Github first. pip supports installing directly from VCS (version control systems) repos like git using a variety of protocols including HTTP, HTTPS, and SSH, among others. See the docs for examples.

To see all of the pip install command options, run

pip install --help
MattDMo
  • 100,794
  • 21
  • 241
  • 231
  • But I need to install an optional dependency e.g. mypackage[redis] How is that addressed? There are about 15 optional dependency install but I just need 1. – Tampa Jan 08 '17 at 20:09
  • 3
    @Tampa as far as I can tell, `pip install /opt/mypackage[redis]` should work. – MattDMo Jan 08 '17 at 20:18
  • Thank you! Yes - when I used `-e` with a conda environment, it installed to the wrong place (ie to the calling directory). Dropped -e flag and installed to my conda site packages – Adam Hughes Feb 24 '20 at 15:05
  • Also, that -e (editable) flag is helpful in general if that's what you want, it just isn't the answer to this question in particular, correct? – Apples14 Jun 06 '22 at 14:51
  • 1
    @Apples14 It's not the answer to this question *unless* you want to do further development on the package. For standard use ("I just want to import this package in my code"), `-e` is not desirable. – MattDMo Jun 06 '22 at 15:54
44

You were looking for help on installations with pip. You can find it with the following command:

pip install --help

Running pip install -e /path/to/package installs the package in a way, that you can edit the package, and when a new import call looks for it, it will import the edited package code. This can be very useful for package development. Only use the -e flag if you need to edit the package's source code.

Further information about local installs and the -e/--editable flag of pip and its caveats is available in the official pip "Local project installs" and setuptools "Development Mode (a.k.a. "Editable Installs)" documentation chapters. The latter also lists a range of limitations of editable installs.

fabianegli
  • 2,056
  • 1
  • 18
  • 35
  • 2
    As I explained in [my answer](https://stackoverflow.com/a/41537134/1426065), installing with `-e` requires that the package source stay in the same place (`/opt/mypackage` in this case) forever, which may not be desirable, or even possible if it's in `/tmp`. Pointing `pip` directly to the directory containing `setup.py` is definitely the way to go here. – MattDMo Jul 12 '20 at 01:02
0

This command helped me.

pip install path/to/dir --use-feature=in-tree-build

  • 2
    Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Jul 19 '22 at 17:50
  • 2
    This command does not work in 2022 with the latest pip version. – Sigmatics Sep 22 '22 at 16:16