Может ли Pip устанавливать зависимости, не указанные в setup.py во время установки? - PullRequest
21 голосов
/ 11 ноября 2010

Я бы хотел, чтобы pip установил зависимость, которая у меня есть, на GitHub, когда пользователь вводит команду для установки исходного программного обеспечения, также из источника на GitHub. Ни один из этих пакетов не находится на PyPi (и никогда не будет).

Пользователь выдает команду:

pip -e git+https://github.com/Lewisham/cvsanaly@develop#egg=cvsanaly

В этом репо есть файл requirements.txt с другой зависимостью от GitHub:

-e git+https://github.com/Lewisham/repositoryhandler#egg=repositoryhandler

Мне нужна одиночная команда , которую пользователь может выдать для установки исходного пакета, попросить pip найти файл требований, а затем установить зависимость тоже.

Ответы [ 3 ]

36 голосов
/ 19 декабря 2010

Этот ответ помог мне решить ту же проблему, о которой вы говорите.

Кажется, для setup.py не существует простого способа использовать файл требований напрямую для определения его зависимостей, но ту же информацию можно поместить в сам файл setup.py.

У меня есть эти требования. Текст:

PIL
-e git://github.com/gabrielgrant/django-ckeditor.git#egg=django-ckeditor

Но при установке пакета, содержащего этот файл require.txt, требования игнорируются pip.

Этот setup.py, кажется, принуждает pip к установке зависимостей (включая мою версию django-ckeditor на github):

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',
    ]
)

Edit:

Этот ответ также содержит некоторую полезную информацию.

Указание версии как части "#egg = ..." необходимо для определения, какая версия пакета доступна по ссылке. Обратите внимание, однако, что если вы всегда хотите зависеть от вашей последней версии, вы можете установить версию на dev в install_requires, dependency_links и в файле setup.py

Редактировать: с использованием dev в качестве версии не очень хорошая идея, согласно комментариям ниже.

13 голосов
/ 03 февраля 2012

Вот небольшой скрипт, который я использовал для генерации install_requires и dependency_links из файла требований.

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)
1 голос
/ 18 июня 2012

это отвечает на ваш вопрос?

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(),
  )
...