install_requires based on python version
Asked Answered
P

2

61

I have a module that works both on python 2 and python 3. In Python<3.2 I would like to install a specific package as a dependency. For Python>=3.2.

Something like:

 install_requires=[
    "threadpool >= 1.2.7 if python_version < 3.2.0",
 ],

How can one make that?

Penetration answered 13/1, 2014 at 0:19 Comment(0)
F
112

Use environment markers:

install_requires=[
    'threadpool >= 1.2.7; python_version < "3.2.0"',
]

Setuptools specific usage is detailed in their documentation. The syntax shown above requires setuptools v36.2+ (change log).

Farci answered 18/9, 2015 at 2:59 Comment(1)
Don't omit the quotation marks around the python version number.Belcher
G
8

This has been discussed here, it would appear the recommend way is to test for the Python version inside your setup.py using sys.version_info;

import sys

if sys.version_info >= (3,2):
    install_requires = ["threadpool >= 1.2.7"]
else:
    install_requires = ["threadpool >= 1.2.3"]

setup(..., install_requires=install_requires)
Gonococcus answered 13/1, 2014 at 0:28 Comment(3)
This solution is fragile with many combinations of pip and wheel packages. When pip builds wheels on your behalf, the computed install_requires list is written in the wheel metadata and then the cached wheel might be used on a different Python version.Litmus
Thanks. This used to work for me, then stopped. With your comment I was able to figure out it was because I recently changed my publish command to bdist_wheel.Nona
It will not generate the correct package metadata this way. Avoid.Adrenocorticotropic

© 2022 - 2024 — McMap. All rights reserved.