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'

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"

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

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://git@github.com/org_or_username/repo.git@branch#subdirectory=path/to/dubdir
— RDK
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.