[英]Python best practice for when an module is not always available
我有一个在 cuda 上运行的 Python 代码。 现在我需要支持无法运行 cuda 的新部署设备,因为它们没有 Nvidia GPU。 由于我在代码中有很多cupy
导入,我想知道这种情况的最佳实践是什么。
例如,我可能必须根据 cuda 的可用性导入某些类。 这看起来很恶心。 我可以遵循任何好的编程模式吗?
例如,我最终会做这样的事情:
from my_custom_autoinit import is_cupy_available
if is_cupy_available:
import my_module_that_uses_cupy
其中my_custom_autoinit.py
是:
try:
import cupy as cp
is_cupy_available = True
except ModuleNotFoundError:
is_cupy_available = False
这带来了一个令人讨厌的缺点:每次我想使用my_module_that_uses_cupy
时,我都需要检查cupy
是否可用。 我个人不喜欢这个,我猜有人想出了比这更好的东西。 谢谢
您可以在项目中添加一个名为cupywrapper
的模块,其中包含您的try..except
Cupywrapper.py
try:
import cupy as cp
is_cupy_available = True
except ModuleNotFoundError:
import numpy as cp
is_cupy_available = False
我假设您可以用numpy
代替cupy
,因为来自网站:
CuPy的接口与NumPy高度兼容; 在大多数情况下,它可以用作替代品。 您只需在 Python 代码中用 cupy 替换 numpy 即可。
然后,在您的代码中,您将执行以下操作:
import cupywrapper
cp = cupywrapper.cp
# Now cp is either cupy or numpy
x = [1, 2, 3]
y = [4, 5, 6]
z = cp.dot(x, y)
print(z)
print("cupy? ", cupywrapper.is_cupy_available)
在我的电脑上,我没有安装cupy
,这回落到numpy.dot
,给出 output
32
cupy? False
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.