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

  • Update 12/2024:

    This does not work in recent versions of Python, primarily because the function has been moved around in the pip module. Either way, as stated below by maintainers of the library, it is not recommended to import and use this function, as it is an internal function which is subject to change and being moved around.


    Old answer:

    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
    )