Pip peut-il installer des dépendances non spécifiées dans setup.py au moment de l'installation?
Je voudrais que pip installe une dépendance que j'ai sur GitHub lorsque l'utilisateur émet la commande pour installer le Logiciel original, également à partir de la source sur GitHub. Aucun de ces paquets n'est sur PyPi (et ne le sera jamais).
L'utilisateur émet la commande:
pip -e git+https://github.com/Lewisham/cvsanaly@develop#egg=cvsanaly
Ce repo a un fichier requirements.txt
, avec une autre dépendance sur GitHub:
-e git+https://github.com/Lewisham/repositoryhandler#egg=repositoryhandler
Ce que je voudrais, c'est une commande unique qu'un utilisateur peut émettre pour installer le package d'origine, avoir pip trouver le fichier d'exigences, ensuite, installez la dépendance aussi.
3 réponses
Cette réponse m'a aidé à résoudre le même problème dont vous parlez.
Il ne semble pas y avoir un moyen facile pour setup.py pour utiliser le fichier d'exigences directement pour définir ses dépendances, mais les mêmes informations peuvent être setup.py lui-même.
J'ai cette exigence.txt:
PIL
-e git://github.com/gabrielgrant/django-ckeditor.git#egg=django-ckeditor
Mais lors de l'installation de ces exigences.le paquet contenant txt, les exigences sont ignorées par pip.
Ce setup.py semble forcer pip à installer le dépendances (y compris ma version Github de django-ckeditor):
from setuptools import setup
setup(
name='django-articles',
...,
install_requires=[
'PIL',
'django-ckeditor>=0.9.3',
],
dependency_links = [
'http://github.com/gabrielgrant/django-ckeditor/tarball/master#egg=django-ckeditor-0.9.3',
]
)
Modifier:
Cette réponse contient également des informations utiles.
Spécifiant la version dans le cadre du " #egg=..."est nécessaire pour identifier la version du paquet est disponible sur le lien. notez cependant que si vous voulez toujours dépendre de votre dernière version, vous pouvez définir la version sur dev
dans install_requires, dependency_links et les autres paquets setup.py
Edit: utiliser dev
comme version n'est pas une bonne idée, comme indiqué dans les commentaires ci-dessous.
Voici un petit script que j'ai utilisé pour générer install_requires
et dependency_links
à partir d'un fichier.
import os
import re
def which(program):
"""
Detect whether or not a program is installed.
Thanks to http://stackoverflow.com/a/377028/70191
"""
def is_exe(fpath):
return os.path.exists(fpath) and os.access(fpath, os.X_OK)
fpath, _ = os.path.split(program)
if fpath:
if is_exe(program):
return program
else:
for path in os.environ['PATH'].split(os.pathsep):
exe_file = os.path.join(path, program)
if is_exe(exe_file):
return exe_file
return None
EDITABLE_REQUIREMENT = re.compile(r'^-e (?P<link>(?P<vcs>git|svn|hg|bzr).+#egg=(?P<package>.+)-(?P<version>\d(?:\.\d)*))$')
install_requires = []
dependency_links = []
for requirement in (l.strip() for l in open('requirements')):
match = EDITABLE_REQUIREMENT.match(requirement)
if match:
assert which(match.group('vcs')) is not None, \
"VCS '%(vcs)s' must be installed in order to install %(link)s" % match.groupdict()
install_requires.append("%(package)s==%(version)s" % match.groupdict())
dependency_links.append(match.group('link'))
else:
install_requires.append(requirement)
Cela répond-il à votre question?
setup(name='application-xpto',
version='1.0',
author='me,me,me',
author_email='xpto@mail.com',
packages=find_packages(),
include_package_data=True,
description='web app',
install_requires=open('app/requirements.txt').readlines(),
)