Search code examples
pythonpipsetuptoolsrequirements.txt

Reference requirements.txt for the install_requires kwarg in setuptools setup.py file


I have a requirements.txt file that I'm using with Travis-CI. It seems silly to duplicate the requirements in both requirements.txt and setup.py, so I was hoping to pass a file handle to the install_requires kwarg in setuptools.setup.

Is this possible? If so, how should I go about doing it?

Here is my requirements.txt file:

guessit>=0.5.2
tvdb_api>=1.8.2
hachoir-metadata>=1.3.3
hachoir-core>=1.3.3
hachoir-parser>=1.3.4

Solution

  • You can flip it around and list the dependencies in setup.py and have a single character — a dot . — in requirements.txt instead.


    Alternatively, even if not advised, it is still possible to parse the requirements.txt file (if it doesn't refer any external requirements by URL) with the following hack (tested with pip 9.0.1):

    install_reqs = parse_requirements('requirements.txt', session='hack')
    

    This doesn't filter environment markers though.


    In old versions of pip, more specifically older than 6.0, there is a public API that can be used to achieve this. A requirement file can contain comments (#) and can include some other files (--requirement or -r). Thus, if you really want to parse a requirements.txt you can use the pip parser:

    from pip.req import parse_requirements
    
    # parse_requirements() returns generator of pip.req.InstallRequirement objects
    install_reqs = parse_requirements(<requirements_path>)
    
    # reqs is a list of requirement
    # e.g. ['django==1.5.1', 'mezzanine==1.4.6']
    reqs = [str(ir.req) for ir in install_reqs]
    
    setup(
        ...
        install_requires=reqs
    )