我希望在新的python包中为python包添加一个条件依赖项。如果包已经安装,那么我们希望允许使用特性。否则,我们希望忽略该包。使用软依赖项的原因是某些包可能不会被某些用户使用,因此,我们希望避免安装它们。
阅读:
https://packaging.python.org/en/latest/guides/distributing-packages-using-setuptools/
只有指定硬需求的选项,例如install_requires
。是否有一种方法来指定一个软依赖类似于R的Suggest
字段在DESCRIPTION
文件?
否则,我认为安全保护函数调用将需要软错误,如下所示:
def demo_function():
if load_package("numpy", "np"):
return np.array([1])
return [1]
,其中load_package()
使用以下辅助函数:
def check_installed(name):
import importlib.util
spec = importlib.util.find_spec(name)
if spec is None:
return False
return True
def load_package(name, alias, soft_error = True):
import importlib.util
if check_installed(name):
module = importlib.util.module_from_spec(spec)
if alias is None:
alias = name
sys.modules[alias] = module
spec.loader.exec_module(module)
else:
if hard_error:
return False
else:
raise AssertionError(f"Please install `{name}` package to use this function.")
return True
您可以在导入时使用try:
,或者使用contextlib。要检查导入是否成功,请查看sys.modules:
from contextlib import suppress
with suppress(ModuleNotFoundError):
# noinspection PyUnresolvedReferences
import numpy
import sys
if 'numpy' in sys.modules:
print("numpy was imported")