Peut-Pip installer les dépendances non spécifiées dans setup.py lors de l'installation?
-
08-10-2019 - |
Question
Je Voudrais pip installer une dépendance que j'ai sur GitHub lorsque l'utilisateur exécute la commande pour installer le logiciel d'origine, également de source sur GitHub. Aucun de ces paquets sont sur PyPI (et ne le sera jamais).
Les questions utilisateur la commande:
pip -e git+https://github.com/Lewisham/cvsanaly@develop#egg=cvsanaly
Cette pension 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 est un simple commande qu'un utilisateur peut émettre d'installer l'emballage d'origine, ont pip trouver le fichier des exigences, puis installez la dépendance aussi.
La solution
Cette répondre m'a aidé à résoudre le même problème que vous parlez.
Il ne semble pas être un moyen facile pour setup.py d'utiliser les exigences fichier directement pour définir ses dépendances, mais les mêmes informations peuvent être mis dans le setup.py lui-même.
J'ai cette requirements.txt:
PIL
-e git://github.com/gabrielgrant/django-ckeditor.git#egg=django-ckeditor
Mais lors de l'installation du paquet contenant de cette requirements.txt, les exigences sont ignorées par pip.
Cette setup.py semble pip coerce dans l'installation des 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épondre contient également des informations utiles.
Définition de la version dans le cadre du « #egg = ... » est nécessaire pour identifier la version du paquet est disponible sur le lien. Notez toutefois que si vous voulez toujours dépendre de votre dernière version, vous pouvez définir la version à dev
dans install_requires, dependency_links et l'autre paquet est setup.py
Edit:. en utilisant dev
que la version est pas une bonne idée, selon les commentaires ci-dessous
Autres conseils
Voici un petit script que j'utilisé pour générer install_requires
et dependency_links
à partir d'un fichier des exigences.
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)
fait cette réponse à 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(),
)