Comment puis-je installer à partir d'un sous-répertoire git avec pip?

104

J'ai un référentiel git avec de nombreux dossiers, l'un d'eux étant un module python installable avec pip, comme ceci:

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

Pour le moment, je dois faire ce qui suit pour installer:

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

Est-il possible d'installer le module directement avec pip sans clonage explicite?

J'ai essayé:

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

Mais j'obtiens:

IOError: [Errno 2] No such file or directory: '/tmp/pip-88tlLm-build/setup.py'
J. Martinot-Lagarde
la source
1
Cette question semble déjà avoir été répondue: stackoverflow.com/questions/10847764/pip-install-from-git-repo
synthesizerpatel
1
La question que vous avez liée concernait les fichiers manquants car il n'y a pas de MANIFEST.in. Ma question est de savoir comment installer un sous-répertoire avec pip, aucun fichier ne manque car je peux installer le package en clonant tout le dépôt.
J.Martinot-Lagarde
@synthesizerpatel La question à laquelle vous avez lié pose des questions sur des choses différentes mais le titre était trompeur alors je l'ai corrigé. Vous pouvez envisager de supprimer votre (je suppose) vote défavorable.
Piotr Dobrogost

Réponses:

120

Il y a une pull request concernant cette fonctionnalité, et elle semble avoir été fusionnée pour développer une branche il y a un mois. La syntaxe est la suivante :

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

Nous devons probablement attendre un certain temps jusqu'à ce qu'il soit fusionné avec master et distribué.

MISE À JOUR : Ceci est maintenant disponible et documenté à https://pip.readthedocs.io/en/stable/reference/pip_install/#vcs-support comme suit:

Pour les projets où setup.py n'est pas à la racine du projet, le composant "sous-répertoire" est utilisé. La valeur du composant «sous-répertoire» doit être un chemin partant de la racine du projet jusqu'à l'emplacement de setup.py.

Donc, si la disposition de votre référentiel est:

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

Vous devrez utiliser

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

Remarque: sous Windows, vous devez placer l'URL entre guillemets, ou vous obtiendrez une erreur "'' sous-répertoire 'n'est pas reconnu comme une commande interne ou externe". Par exemple, utilisez:

pip install -e "vcs+protocol://repo_url#egg=pkg&subdirectory=pkg_dir"
Dennis Golomazov
la source
4
Je viens de vérifier et cela fait partie de pip v1.5, publié le 1er janvier 2014: github.com/pypa/pip/blob/develop/CHANGES.txt
tomka
20
Si vous utilisez ubuntu, assurez-vous d'utiliser des guillemets simples avant l'emplacement réel de git, sinon le sous-répertoire & est ignoré! Par exemple: pip install -e 'git + git.repo /… '
Lin
8
Juste un avertissement: cela ne semble pas fonctionner (du moins sur pip v1.5.6, pas sûr de 6+ versions) pour les paquets dont les points d'entrée se trouvent dans le sous-répertoire. pip install -e 'git+https://…/repo.git@branch#egg=package&subdirectory=package'résultats dans le paquet apparaissant à installer, et un package.egg-linkfichier se mettre dans le site-packages - mais il pointe vers le répertoire racine src/repo, pas à src/repo/package, comme je l' attendre. Cela signifie que py_modulescela ne peut pas être importé et entry_pointsne fonctionne pas réellement: ils génèrent tous deux un ImportError: No module named package.
Mark G.
2
-esemble nécessaire, sinon pip freezene montre pas tout le chemin, seulement l'œuf. Cela s'est passé lepip-1.5.4
zyxue
2
astuce pour les autres: vous DEVEZ utiliser git + https, git + git ne fonctionnera pas, vous serez fatal: erreur distante: référentiel introuvable. probablement parce qu'il n'analyse pas correctement la chaîne de "requête". Je viens de me connecter: github.com/pypa/pip/issues/4898
amohr
33

Cela a déjà été indiqué dans l' un des commentaires sous la bonne réponse, mais juste pour mettre en évidence ce problème: lors de l'exécution de ceci à partir de la ligne de commande Linux, vous devez échapper au caractère &-character puisque l'esperluette indique à la ligne de commande d'exécuter une commande en arrière-plan:

git+https://git.repo/some_repo.git#egg=version_subpkg\&subdirectory=repo

Notez la barre oblique inverse avant l'esperluette. Le comportement d'échappement peut dépendre de la distribution Linux; Je ne suis pas un expert.
Si vous ignorez cela, vous risquez de rencontrer une erreur cryptique comme celle-ci:

bash: (...) command not found
Rinderwahn
la source
1
Le fait d'inclure l'URL entre guillemets simples aiderait-il à éviter d'avoir à échapper l'esperluette? Je sais que cela est utile lorsque vous travaillez avec des URL dans cURL.
Josh Peak
1
À noter également: lors de l'exécution de cette commande à partir de la ligne de commande Windows, vous devez placer l'URL entre guillemets, ou vous obtiendrez une erreur "" Le sous-répertoire "n'est pas reconnu comme une commande interne ou externe". Par exemple, utilisez pip install -e "git + myurl / proj # egg = subpkg & subdirectory = subdir "
En général, lorsque vous travaillez avec des scripts shell, utilisez des guillemets doubles autour des arguments pour être du bon côté. pour plus de bonnes pratiques, voir: shellcheck.net ou github.com/koalaman/shellcheck
Erik Aronesty
2
L'échappement est également nécessaire dans OSX (car il s'agit d'une sorte de distribution Linux)
ygesher
6
Pour une installation en succursale:pip install git+ssh://[email protected]/org_or_username/repo.git@branch#subdirectory=path/to/dubdir
RDK