Say I want to install pyodbc
. It can't be build on some Windows machines but there's an alternative - pypyodbc
which is pure python implementation of pyobdc
.
Is there a way to specify install_requires=["pyobdc"]
for setuptools.setup
with falling back to pypyodbc
if the former package wasn't installed?
UPD: My solution for this particular situation:
import sys
from setuptools import setup
if sys.platform.startswith("win"):
pyodbc = "pypyodbc>=1.2.0"
else:
pyodbc = "pyodbc>=3.0.7"
...
setup(
...
install_requires=[pyobdc]
)
But I still look for a more general solution.
Doing what you are already doing seems like a common recommendation, but since this question is the top google hit for this sort of question, I'll point out that install_requires
supports a fairly intricate mini-language which is specified in PEP 508:
install_requires = [
'pypyodbc>=1.2.0;platform_system=="Windows"',
'pyodbc>=3.0.7;platform_system!="Windows"'
]
In a comment to a related question, user Marius Gedminas notes that having your install_requires
computed in code could have some adverse effects, so the above should be preferred to avoid that problem.
(On the other hand, https://hynek.me/articles/conditional-python-dependencies/ laments some pretty serious portability problems if you have to support old versions of setuptools
.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With