Can Pip install dependencies not specified in setup.py at install time?

后端 未结 3 1533
不知归路
不知归路 2020-12-12 20:04

I\'d like pip to install a dependency that I have on GitHub when the user issues the command to install the original software, also from source on GitHub. Neither of these p

相关标签:
3条回答
  • 2020-12-12 20:16

    This answer helped me solve the same problem you're talking about.

    There doesn't seem to be an easy way for setup.py to use the requirements file directly to define its dependencies, but the same information can be put into the setup.py itself.

    I have this requirements.txt:

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

    But when installing that requirements.txt's containing package, the requirements are ignored by pip.

    This setup.py seems to coerce pip into installing the dependencies (including my github version of 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',
        ]
    )
    

    Edit:

    This answer also contains some useful information.

    Specifying the version as part of the "#egg=..." is required to identify which version of the package is available at the link. Note, however, that if you always want to depend on your latest version, you can set the version to dev in install_requires, dependency_links and the other package's setup.py

    Edit: using dev as the version isn't a good idea, as per comments below.

    0 讨论(0)
  • 2020-12-12 20:17

    does this answer your 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(),
      )
    
    0 讨论(0)
  • 2020-12-12 20:30

    Here's a small script I used to generate install_requires and dependency_links from a requirements file.

    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)
    
    0 讨论(0)
提交回复
热议问题