Search code examples
pythongitpip

How can I install from a git subdirectory with pip?


I have a git repository with many folders, one of them being a python module installable with pip, like this:

repo.git/
repo.git/folder1/
repo.git/folder2/
repo.git/mymodule/
repo.git/mymodule/__init__.py
repo.git/mymodule/setup.py
repo.git/mymodule/...

Right now I have to do the following to install:

git clone http://server/repo.git
cd repo
pip install mymodule
cd ..
rm -rf repo

Is it possible to install the module directly with pip without explicitly cloning ?

I tried:

pip install git+https://server/repo.git/mymodule/
pip install git+https://server/repo.git:mymodule/

But I get:

IOError: [Errno 2] No such file or directory: '/tmp/pip-88tlLm-build/setup.py'

Solution

  • There is a pull request regarding this feature, and it seems to have been merged to develop branch a month ago. The syntax is the following:

    pip install -e "git+https://git.repo/some_repo.git#egg=$NAME_OF_PACKAGE&subdirectory=$SUBDIR_IN_REPO" # install a python package from a repo subdirectory
    

    We probably have to wait for a while until it gets merged to master and is distributed.

    UPDATE: This is now available and documented at https://pip.pypa.io/en/stable/cli/pip_install/#vcs-support as follows:

    For projects where setup.py is not in the root of project, "subdirectory" component is used. Value of "subdirectory" component should be a path starting from root of the project to where setup.py is located.

    So if your repository layout is:

    - pkg_dir/
      - setup.py  # setup.py for package ``pkg``
      - some_module.py
    - other_dir/
      - some_file
    - some_other_file
    

    You'll need to use

    pip install -e "vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir"
    

    Note: Make sure to surround it with quotes otherwise subdirectory won't work.