Могут ли устанавливать установки PP, не указанные в setup.py во время установки?

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

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

pip -e git+https://github.com/Lewisham/[email protected]#egg=cvsanaly

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

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

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

Ответ 1

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

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

У меня есть this requirements.txt:

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

Но при установке этого пакета требований requirements.txt требования игнорируются пиком.

Этот 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, поскольку версия не является хорошей идеей, как указано ниже.

Ответ 2

Здесь небольшой script я использовал для генерации 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)

Ответ 3

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

setup(name='application-xpto',
  version='1.0',
  author='me,me,me',
  author_email='[email protected]',
  packages=find_packages(),
  include_package_data=True,
  description='web app',
  install_requires=open('app/requirements.txt').readlines(),
  )