1

Is there a way to make certain dependencies for a python package optional ? Or conditional on the installation of another dependency failing.

The two cases I have are:

  1. I want to install dependency x AND y. However, in case either of the install fails, the package can probably work alright with just one of them, so installation should complete with a warning.
  2. I want to install dependency x IF the installation of y failed.
George
  • 3,521
  • 4
  • 30
  • 75

1 Answers1

1

You can have conditional dependencies, but not based on the success/failure of the installation of other dependencies.

You can have optional dependencies, but an install will still fail if an optional dependency fails to install.

The simplest way to do have dependencies be optional (i.e. won't fail the main installation if they fail to install) or conditional (based on the success/failure of other packages) is by adding a custom install command that manually shells out to pip to install the individual packages, and checks the result of each call.

In your setup.py:

import sys
import subprocess
from setuptools import setup
from setuptools.command.install import install

class MyInstall(install):
    def run(self):
        # Attempt to install optional dependencies
        try:
            subprocess.check_call([sys.executable, "-m", "pip", "install", "dependency-y"])
        except subprocess.CalledProcessError:
            subprocess.check_call([sys.executable, "-m", "pip", "install", "dependency-x"])

        # Continue with regular installation
        install.run(self)

setup(
    ...

    cmdclass={
        'install': MyInstall,
    },
)

Note that this will only work if you publish a source distribution (.tar.gz or .zip). It will not work if you publish your package as a built distribution (.whl).

Dustin Ingram
  • 20,502
  • 7
  • 59
  • 82