Skip to content

Install

feu.install

Contain package installers.

feu.install.BaseInstaller

Bases: ABC

Define the base class to implement a package installer.

Example usage:

>>> from feu.install.pip import PipInstaller
>>> from feu.utils.package import PackageSpec
>>> installer = PipInstaller()
>>> installer
PipInstaller(arguments='')
>>> installer.install(PackageSpec(name="pandas", version="2.2.2"))  # doctest: +SKIP

feu.install.BaseInstaller.equal abstractmethod

equal(other: Any) -> bool

Indicate if two installers are equal or not.

Parameters:

Name Type Description Default
other Any

The other object to compare.

required

Returns:

Type Description
bool

True if the two installers are equal, otherwise False.

Example usage:

>>> from feu.install.pip import PipInstaller
>>> from feu.utils.package import PackageSpec
>>> obj1 = PipInstaller()
>>> obj2 = PipInstaller()
>>> obj3 = PipInstaller("-U")
>>> obj1.equal(obj2)
True
>>> obj1.equal(obj3)
False

feu.install.BaseInstaller.install abstractmethod

install(package: PackageSpec) -> None

Install the given package.

Parameters:

Name Type Description Default
package PackageSpec

The package specification of the package to install.

required

Example usage:

>>> from feu.install.pip import PipInstaller
>>> from feu.utils.package import PackageSpec
>>> installer = PipInstaller()
>>> installer.install(PackageSpec(name="pandas", version="2.2.2"))  # doctest: +SKIP

feu.install.BaseInstaller.instantiate_with_arguments abstractmethod classmethod

instantiate_with_arguments(arguments: str) -> Self

Instantiate an installer instance with custom arguments.

Parameters:

Name Type Description Default
arguments str

The installer arguments.

required

Returns:

Type Description
Self

An instantiated installer.

Example usage:

>>> from feu.install.pip import PipInstaller
>>> installer = PipInstaller.instantiate_with_arguments("-U")
>>> installer
PipInstaller(arguments='-U')

feu.install.InstallerRegistry

Implement the main installer registry.

feu.install.InstallerRegistry.add_installer classmethod

add_installer(
    name: str,
    installer: type[BaseInstaller],
    exist_ok: bool = False,
) -> None

Add an installer for a given package.

Parameters:

Name Type Description Default
name str

The installer name e.g. pip or uv.

required
installer type[BaseInstaller]

The installer used for the given package.

required
exist_ok bool

If False, RuntimeError is raised if the installer already exists. This parameter should be set to True to overwrite the installer for a package.

False

Raises:

Type Description
RuntimeError

if an installer is already registered for the package name and exist_ok=False.

Example usage:

>>> from feu.install import InstallerRegistry
>>> from feu.install.pip import PipInstaller
>>> InstallerRegistry.add_installer("pip", PipInstaller, exist_ok=True)

feu.install.InstallerRegistry.has_installer classmethod

has_installer(name: str) -> bool

Indicate if an installer is registered for the given name.

Parameters:

Name Type Description Default
name str

The installer name.

required

Returns:

Type Description
bool

True if an installer is registered, otherwise False.

Example usage:

>>> from feu.install import InstallerRegistry
>>> InstallerRegistry.has_installer("pip")
True

feu.install.InstallerRegistry.install classmethod

install(
    installer: InstallerSpec, package: PackageSpec
) -> None

Install a package and associated packages by using the specified installer.

Parameters:

Name Type Description Default
installer InstallerSpec

The installer specification.

required
package PackageSpec

The package specification.

required

Example usage:

>>> from feu.install import InstallerRegistry
>>> from feu.utils.installer import InstallerSpec
>>> from feu.utils.package import PackageSpec
>>> InstallerRegistry.install(
...     installer=InstallerSpec("pip"), package=PackageSpec(name="pandas", version="2.2.2")
... )  # doctest: +SKIP

feu.install.get_available_installers cached

get_available_installers() -> tuple[str, ...]

Get the available installers.

Returns:

Type Description
tuple[str, ...]

The available installers.

Example usage:

>>> from feu.install import get_available_installers
>>> get_available_installers()
(...)

feu.install.install_package

install_package(
    installer: InstallerSpec, package: PackageSpec
) -> None

Install a package with the specified installer.

Parameters:

Name Type Description Default
installer InstallerSpec

The installer specification.

required
package PackageSpec

The package specification.

required

Example usage:

>>> from feu.install import install_package
>>> from feu.utils.installer import InstallerSpec
>>> from feu.utils.package import PackageSpec
>>> install_package(
...     installer=InstallerSpec("pip"), package=PackageSpec(name="pandas", version="2.2.2")
... )  # doctest: +SKIP

feu.install.install_package_closest_version

install_package_closest_version(
    installer: InstallerSpec, package: PackageSpec
) -> None

Install a package and associated packages by using the secified installer.

This function finds the closest valid version if the specified version is not compatible.

Parameters:

Name Type Description Default
installer InstallerSpec

The installer specification.

required
package PackageSpec

The package specification.

required

Example usage:

>>> from feu.install import install_package_closest_version
>>> from feu.utils.installer import InstallerSpec
>>> from feu.utils.package import PackageSpec
>>> install_package_closest_version(
...     installer=InstallerSpec("pip"), package=PackageSpec(name="pandas", version="2.2.2")
... )  # doctest: +SKIP

feu.install.is_pip_available cached

is_pip_available() -> bool

Check if pip is available.

Returns:

Type Description
bool

True if pip is available, otherwise False.

Example usage:

>>> from feu.install import is_pip_available
>>> is_pip_available()

feu.install.is_pipx_available cached

is_pipx_available() -> bool

Check if pipx is available.

Returns:

Type Description
bool

True if pipx is available, otherwise False.

Example usage:

>>> from feu.install import is_pipx_available
>>> is_pipx_available()

feu.install.is_uv_available cached

is_uv_available() -> bool

Check if uv is available.

Returns:

Type Description
bool

True if uv is available, otherwise False.

Example usage:

>>> from feu.install import is_uv_available
>>> is_uv_available()

feu.install.pip

Contain functionalities to install packages with pip or compatible package installers.

feu.install.pip.PipInstaller

Bases: BasePipInstaller

Implement a pip package installer.

Example usage:

>>> from feu.install.pip import PipInstaller
>>> from feu.utils.package import PackageSpec
>>> installer = PipInstaller()
>>> installer
PipInstaller(arguments='')
>>> installer.install(PackageSpec(name="pandas", version="2.2.2"))  # doctest: +SKIP

feu.install.pip.PipxInstaller

Bases: BasePipInstaller

Implement a pipx package installer.

Example usage:

>>> from feu.install.pip import PipxInstaller
>>> from feu.utils.package import PackageSpec
>>> installer = PipxInstaller()
>>> installer
PipxInstaller(arguments='')
>>> installer.install(PackageSpec(name="pandas", version="2.2.2"))  # doctest: +SKIP

feu.install.pip.UvInstaller

Bases: BasePipInstaller

Implement a uv package installer.

Example usage:

>>> from feu.install.pip import UvInstaller
>>> from feu.utils.package import PackageSpec
>>> installer = UvInstaller()
>>> installer
UvInstaller(arguments='')
>>> installer.install(PackageSpec(name="pandas", version="2.2.2"))  # doctest: +SKIP

feu.install.pip.installer

Define the pip compatible installers.

feu.install.pip.installer.BasePipInstaller

Bases: BaseInstaller

Define an intermediate base class to implement pip compatible package installer.

Parameters:

Name Type Description Default
arguments str

Optional arguments to pass to the package installer. The valid arguments depend on the package installer.

''

Example usage (subclassing):

>>> from feu.install.pip.installer import BasePipInstaller
>>> from feu.utils.package import PackageSpec, PackageDependency
>>> class MyInstaller(BasePipInstaller):
...     def _generate_command(self, deps, args):
...         return f"echo Installing {', '.join(map(str, deps))} with args: {args}"
...
>>> installer = MyInstaller(arguments="--verbose")
>>> installer
MyInstaller(arguments='--verbose')
>>> installer.install(PackageSpec(name="pandas", version="2.2.2"))  # doctest: +SKIP

feu.install.pip.installer.PipInstaller

Bases: BasePipInstaller

Implement a pip package installer.

Example usage:

>>> from feu.install.pip import PipInstaller
>>> from feu.utils.package import PackageSpec
>>> installer = PipInstaller()
>>> installer
PipInstaller(arguments='')
>>> installer.install(PackageSpec(name="pandas", version="2.2.2"))  # doctest: +SKIP

feu.install.pip.installer.PipxInstaller

Bases: BasePipInstaller

Implement a pipx package installer.

Example usage:

>>> from feu.install.pip import PipxInstaller
>>> from feu.utils.package import PackageSpec
>>> installer = PipxInstaller()
>>> installer
PipxInstaller(arguments='')
>>> installer.install(PackageSpec(name="pandas", version="2.2.2"))  # doctest: +SKIP

feu.install.pip.installer.UvInstaller

Bases: BasePipInstaller

Implement a uv package installer.

Example usage:

>>> from feu.install.pip import UvInstaller
>>> from feu.utils.package import PackageSpec
>>> installer = UvInstaller()
>>> installer
UvInstaller(arguments='')
>>> installer.install(PackageSpec(name="pandas", version="2.2.2"))  # doctest: +SKIP

feu.install.pip.resolver

Contain pip compatible package dependency resolvers.

feu.install.pip.resolver.BaseDependencyResolver

Bases: ABC

Define the base class for pip-compatible package dependency resolvers.

Example usage:

>>> from feu.install.pip.resolver import DependencyResolver
>>> from feu.utils.package import PackageSpec
>>> resolver = DependencyResolver()
>>> resolver
DependencyResolver()
>>> deps = resolver.resolve(PackageSpec(name="my_package", version="1.2.3"))
>>> deps
[PackageDependency(name='my_package', version_specifiers=['==1.2.3'], extras=None)]

feu.install.pip.resolver.BaseDependencyResolver.equal abstractmethod

equal(other: Any) -> bool

Indicate if two dependency resolvers are equal or not.

Parameters:

Name Type Description Default
other Any

The other object to compare.

required

Returns:

Type Description
bool

True if the two dependency resolvers are equal, otherwise False.

Example usage:

>>> from feu.install.pip.resolver import DependencyResolver, TorchDependencyResolver
>>> from feu.utils.package import PackageSpec
>>> obj1 = DependencyResolver()
>>> obj2 = DependencyResolver()
>>> obj3 = TorchDependencyResolver()
>>> obj1.equal(obj2)
True
>>> obj1.equal(obj3)
False

feu.install.pip.resolver.BaseDependencyResolver.resolve abstractmethod

resolve(package: PackageSpec) -> list[PackageDependency]

Find the dependency packages to install a specific package.

Parameters:

Name Type Description Default
package PackageSpec

The target package to install.

required

Returns:

Type Description
list[PackageDependency]

The list of package dependencies.

Example usage:

>>> from feu.install.pip.resolver import DependencyResolver
>>> from feu.utils.package import PackageSpec
>>> resolver = DependencyResolver()
>>> deps = resolver.resolve(PackageSpec(name="my_package", version="1.2.3"))
>>> deps
[PackageDependency(name='my_package', version_specifiers=['==1.2.3'], extras=None)]

feu.install.pip.resolver.DependencyResolver

Bases: BaseDependencyResolver

Define the default package dependency resolver.

Example usage:

>>> from feu.install.pip.resolver import DependencyResolver
>>> from feu.utils.package import PackageSpec
>>> resolver = DependencyResolver()
>>> resolver
DependencyResolver()
>>> deps = resolver.resolve(PackageSpec(name="my_package", version="1.2.3"))
>>> deps
[PackageDependency(name='my_package', version_specifiers=['==1.2.3'], extras=None)]

feu.install.pip.resolver.DependencyResolverRegistry

Implement the main dependency resolver registry.

The dependency resolvers are indexed by name.

feu.install.pip.resolver.DependencyResolverRegistry.add_resolver classmethod

add_resolver(
    package: PackageSpec,
    resolver: BaseDependencyResolver,
    exist_ok: bool = False,
) -> None

Add a dependency resolver for a given package.

Parameters:

Name Type Description Default
package PackageSpec

The package specification.

required
resolver BaseDependencyResolver

The resolver used for the given package.

required
exist_ok bool

If False, RuntimeError is raised if the package already exists. This parameter should be set to True to overwrite the resolver for a package.

False

Raises:

Type Description
RuntimeError

if a dependency resolver is already registered for the package name and exist_ok=False.

Example usage:

>>> from feu.install.pip.resolver import (
...     DependencyResolverRegistry,
...     TorchDependencyResolver,
... )
>>> from feu.utils.package import PackageSpec
>>> DependencyResolverRegistry.add_resolver(
...     PackageSpec("torch"), TorchDependencyResolver(), exist_ok=True
... )

feu.install.pip.resolver.DependencyResolverRegistry.find_resolver classmethod

find_resolver(
    package: PackageSpec,
) -> BaseDependencyResolver

Find the relevant dependency resolver for the given package.

Parameters:

Name Type Description Default
package PackageSpec

The package specification.

required

Returns:

Type Description
BaseDependencyResolver

The dependency resolver for the package.

Example usage:

>>> from feu.install.pip.resolver import DependencyResolverRegistry
>>> from feu.utils.package import PackageSpec
>>> resolver = DependencyResolverRegistry.find_resolver(PackageSpec("torch"))
>>> resolver
TorchDependencyResolver(min_version=2.3.0)

feu.install.pip.resolver.DependencyResolverRegistry.has_resolver classmethod

has_resolver(package: PackageSpec) -> bool

Indicate if a dependency resolver is registered for the given package specification.

Parameters:

Name Type Description Default
package PackageSpec

The package specification.

required

Returns:

Type Description
bool

True if a dependency resolver is registered, otherwise False.

Example usage:

>>> from feu.install.pip.resolver import DependencyResolverRegistry
>>> from feu.utils.package import PackageSpec
>>> DependencyResolverRegistry.has_resolver(PackageSpec("torch"))
True

feu.install.pip.resolver.JaxDependencyResolver

Bases: DependencyResolver

Implement the jax dependency resolver.

numpy 2.0 support was added in jax 0.4.26.

Example usage:

>>> from feu.install.pip.resolver import JaxDependencyResolver
>>> from feu.utils.package import PackageSpec
>>> resolver = JaxDependencyResolver()
>>> resolver
JaxDependencyResolver()
>>> deps = resolver.resolve(PackageSpec(name="jax", version="0.4.26"))
>>> deps
[PackageDependency(name='jax', version_specifiers=['==0.4.26'], extras=None),
 PackageDependency(name='jaxlib', version_specifiers=['==0.4.26'], extras=None)]
>>> deps = resolver.resolve(PackageSpec(name="jax", version="0.4.25"))
>>> deps
[PackageDependency(name='jax', version_specifiers=['==0.4.25'], extras=None),
 PackageDependency(name='jaxlib', version_specifiers=['==0.4.25'], extras=None),
 PackageDependency(name='numpy', version_specifiers=['<2.0.0'], extras=None)]

feu.install.pip.resolver.MatplotlibDependencyResolver

Bases: Numpy2DependencyResolver

Implement the matplotlib dependency resolver.

numpy 2.0 support was added in matplotlib 3.8.4.

Example usage:

>>> from feu.install.pip.resolver import MatplotlibDependencyResolver
>>> from feu.utils.package import PackageSpec
>>> resolver = MatplotlibDependencyResolver()
>>> resolver
MatplotlibDependencyResolver(min_version=3.8.4)
>>> deps = resolver.resolve(PackageSpec(name="matplotlib", version="3.8.4"))
>>> deps
[PackageDependency(name='matplotlib', version_specifiers=['==3.8.4'], extras=None)]
>>> deps = resolver.resolve(PackageSpec(name="matplotlib", version="3.8.3"))
>>> deps
[PackageDependency(name='matplotlib', version_specifiers=['==3.8.3'], extras=None),
 PackageDependency(name='numpy', version_specifiers=['<2.0.0'], extras=None)]

feu.install.pip.resolver.Numpy2DependencyResolver

Bases: DependencyResolver

Define a dependency resolver to work with packages that did not pin numpy<2.0 and are not fully compatible with numpy 2.0.

https://github.com/numpy/numpy/issues/26191 indicates the packages that are compatible with numpy 2.0.

Parameters:

Name Type Description Default
min_version str

The first version that is fully compatible with numpy 2.0.

required

Example usage:

>>> from feu.install.pip.resolver import Numpy2DependencyResolver
>>> from feu.utils.package import PackageSpec
>>> resolver = Numpy2DependencyResolver(min_version="1.2.3")
>>> resolver
Numpy2DependencyResolver(min_version=1.2.3)
>>> deps = resolver.resolve(PackageSpec(name="my_package", version="1.2.3"))
>>> deps
[PackageDependency(name='my_package', version_specifiers=['==1.2.3'], extras=None)]
>>> deps = resolver.resolve(PackageSpec(name="my_package", version="1.2.2"))
>>> deps
[PackageDependency(name='my_package', version_specifiers=['==1.2.2'], extras=None),
 PackageDependency(name='numpy', version_specifiers=['<2.0.0'], extras=None)]

feu.install.pip.resolver.PandasDependencyResolver

Bases: Numpy2DependencyResolver

Implement the pandas dependency resolver.

numpy 2.0 support was added in pandas 2.2.2.

Example usage:

>>> from feu.install.pip.resolver import PandasDependencyResolver
>>> from feu.utils.package import PackageSpec
>>> resolver = PandasDependencyResolver()
>>> resolver
PandasDependencyResolver(min_version=2.2.2)
>>> deps = resolver.resolve(PackageSpec(name="pandas", version="2.2.2"))
>>> deps
[PackageDependency(name='pandas', version_specifiers=['==2.2.2'], extras=None)]
>>> deps = resolver.resolve(PackageSpec(name="pandas", version="2.2.1"))
>>> deps
[PackageDependency(name='pandas', version_specifiers=['==2.2.1'], extras=None),
 PackageDependency(name='numpy', version_specifiers=['<2.0.0'], extras=None)]

feu.install.pip.resolver.PyarrowDependencyResolver

Bases: Numpy2DependencyResolver

Implement the pyarrow dependency resolver.

numpy 2.0 support was added in pyarrow 16.0.

Example usage:

>>> from feu.install.pip.resolver import PyarrowDependencyResolver
>>> from feu.utils.package import PackageSpec
>>> resolver = PyarrowDependencyResolver()
>>> resolver
PyarrowDependencyResolver(min_version=16.0)
>>> deps = resolver.resolve(PackageSpec(name="pyarrow", version="16.0"))
>>> deps
[PackageDependency(name='pyarrow', version_specifiers=['==16.0'], extras=None)]
>>> deps = resolver.resolve(PackageSpec(name="pyarrow", version="15.0"))
>>> deps
[PackageDependency(name='pyarrow', version_specifiers=['==15.0'], extras=None),
 PackageDependency(name='numpy', version_specifiers=['<2.0.0'], extras=None)]

feu.install.pip.resolver.ScipyDependencyResolver

Bases: Numpy2DependencyResolver

Implement the scipy dependency resolver.

numpy 2.0 support was added in scipy 1.13.0.

Example usage:

>>> from feu.install.pip.resolver import ScipyDependencyResolver
>>> from feu.utils.package import PackageSpec
>>> resolver = ScipyDependencyResolver()
>>> resolver
ScipyDependencyResolver(min_version=1.13.0)
>>> deps = resolver.resolve(PackageSpec(name="scipy", version="1.13.0"))
>>> deps
[PackageDependency(name='scipy', version_specifiers=['==1.13.0'], extras=None)]
>>> deps = resolver.resolve(PackageSpec(name="scipy", version="1.12.0"))
>>> deps
[PackageDependency(name='scipy', version_specifiers=['==1.12.0'], extras=None),
 PackageDependency(name='numpy', version_specifiers=['<2.0.0'], extras=None)]

feu.install.pip.resolver.SklearnDependencyResolver

Bases: Numpy2DependencyResolver

Implement the scikit-learn dependency resolver.

numpy 2.0 support was added in scikit-learn 1.4.2.

Example usage:

>>> from feu.install.pip.resolver import SklearnDependencyResolver
>>> from feu.utils.package import PackageSpec
>>> resolver = SklearnDependencyResolver()
>>> resolver
SklearnDependencyResolver(min_version=1.4.2)
>>> deps = resolver.resolve(PackageSpec(name="scikit-learn", version="1.4.2"))
>>> deps
[PackageDependency(name='scikit-learn', version_specifiers=['==1.4.2'], extras=None)]
>>> deps = resolver.resolve(PackageSpec(name="scikit-learn", version="1.4.1"))
>>> deps
[PackageDependency(name='scikit-learn', version_specifiers=['==1.4.1'], extras=None),
 PackageDependency(name='numpy', version_specifiers=['<2.0.0'], extras=None)]

feu.install.pip.resolver.TorchDependencyResolver

Bases: Numpy2DependencyResolver

Implement the torch dependency resolver.

numpy 2.0 support was added in torch 2.3.0.

Example usage:

>>> from feu.install.pip.resolver import TorchDependencyResolver
>>> from feu.utils.package import PackageSpec
>>> resolver = TorchDependencyResolver()
>>> resolver
TorchDependencyResolver(min_version=2.3.0)
>>> deps = resolver.resolve(PackageSpec(name="torch", version="2.3.0"))
>>> deps
[PackageDependency(name='torch', version_specifiers=['==2.3.0'], extras=None)]
>>> deps = resolver.resolve(PackageSpec(name="torch", version="2.2.0"))
>>> deps
[PackageDependency(name='torch', version_specifiers=['==2.2.0'], extras=None),
 PackageDependency(name='numpy', version_specifiers=['<2.0.0'], extras=None)]

feu.install.pip.resolver.XarrayDependencyResolver

Bases: Numpy2DependencyResolver

Implement the xarray dependency resolver.

numpy 2.0 support was added in xarray 2024.6.0.

Example usage:

>>> from feu.install.pip.resolver import XarrayDependencyResolver
>>> from feu.utils.package import PackageSpec
>>> resolver = XarrayDependencyResolver()
>>> resolver
XarrayDependencyResolver(min_version=2024.6.0)
>>> deps = resolver.resolve(PackageSpec(name="xarray", version="2024.6.0"))
>>> deps
[PackageDependency(name='xarray', version_specifiers=['==2024.6.0'], extras=None)]
>>> deps = resolver.resolve(PackageSpec(name="xarray", version="2024.5.0"))
>>> deps
[PackageDependency(name='xarray', version_specifiers=['==2024.5.0'], extras=None),
 PackageDependency(name='numpy', version_specifiers=['<2.0.0'], extras=None)]

feu.install.utils

Contain utility functions to install packages.

feu.install.utils.get_available_installers cached

get_available_installers() -> tuple[str, ...]

Get the available installers.

Returns:

Type Description
tuple[str, ...]

The available installers.

Example usage:

>>> from feu.install import get_available_installers
>>> get_available_installers()
(...)

feu.install.utils.install_package

install_package(
    installer: InstallerSpec, package: PackageSpec
) -> None

Install a package with the specified installer.

Parameters:

Name Type Description Default
installer InstallerSpec

The installer specification.

required
package PackageSpec

The package specification.

required

Example usage:

>>> from feu.install import install_package
>>> from feu.utils.installer import InstallerSpec
>>> from feu.utils.package import PackageSpec
>>> install_package(
...     installer=InstallerSpec("pip"), package=PackageSpec(name="pandas", version="2.2.2")
... )  # doctest: +SKIP

feu.install.utils.install_package_closest_version

install_package_closest_version(
    installer: InstallerSpec, package: PackageSpec
) -> None

Install a package and associated packages by using the secified installer.

This function finds the closest valid version if the specified version is not compatible.

Parameters:

Name Type Description Default
installer InstallerSpec

The installer specification.

required
package PackageSpec

The package specification.

required

Example usage:

>>> from feu.install import install_package_closest_version
>>> from feu.utils.installer import InstallerSpec
>>> from feu.utils.package import PackageSpec
>>> install_package_closest_version(
...     installer=InstallerSpec("pip"), package=PackageSpec(name="pandas", version="2.2.2")
... )  # doctest: +SKIP

feu.install.utils.is_pip_available cached

is_pip_available() -> bool

Check if pip is available.

Returns:

Type Description
bool

True if pip is available, otherwise False.

Example usage:

>>> from feu.install import is_pip_available
>>> is_pip_available()

feu.install.utils.is_pipx_available cached

is_pipx_available() -> bool

Check if pipx is available.

Returns:

Type Description
bool

True if pipx is available, otherwise False.

Example usage:

>>> from feu.install import is_pipx_available
>>> is_pipx_available()

feu.install.utils.is_uv_available cached

is_uv_available() -> bool

Check if uv is available.

Returns:

Type Description
bool

True if uv is available, otherwise False.

Example usage:

>>> from feu.install import is_uv_available
>>> is_uv_available()