Может ли Pip установить зависимости, не указанные в 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

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

См. также:  Как вызвать функцию, когда пользователь щелкает за пределами диалогового окна
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 3
  1. cflewis

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

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

    У меня есть этот файл requirements.txt:

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

    Но при установке пакета, содержащего файл requirements.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 = [
            'https://github.com/gabrielgrant/django-ckeditor/tarball/master#egg=django-ckeditor-0.9.3',
        ]
    )
    

    Изменить:

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

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

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

    трюк с разработчиком работает только в первый раз, а не в последующие разы. Setup.py проверяет только строку dev как версию для себя person cflewis; 05.07.2012

    @DanEEStar Верно. После установки версии пакета dev setuptools будет считать, что требование выполнено. Как показано в связанном ответе, вам потребуется синхронно обновить версию пакета во всех трех местах : setup.py и install_requires и dependency_links зависимости — не очень практично. person cflewis; 17.12.2012

    да, @DanEEStar, ты прав. Я отредактировал рекомендацию использовать версию ‘dev’. Спасибо вам двоим! person cflewis; 21.02.2013

  2. cflewis

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

    import os
    import re
    
    def which(program):
        """
        Detect whether or not a program is installed.
        Thanks to https://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. cflewis

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

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

    open('app/requirements.txt').readlines() работает только в том случае, если requirements.txt содержит только простые спецификации версии, а не URL-адреса. Их нужно будет разделить в dependency_links, как это сделал Саймон Шаретт. person cflewis; 17.12.2012

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: