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.

21
demandé sur A-B-B 2010-11-11 03:28:48

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.

36
répondu Gabriel Grant 2017-05-23 12:00:24

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)
12
répondu Simon Charette 2012-02-03 07:55:32

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(),
  )
1
répondu daigorocub 2012-06-18 19:35:47