George
George

Reputation: 4011

How to specify optional and coditional dependencies in packages for pip19 & python3.7

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.

Upvotes: 1

Views: 579

Answers (1)

Dustin Ingram
Dustin Ingram

Reputation: 21580

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

Upvotes: 1

Related Questions