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
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.
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
)