繁体   English   中英

Python 模块不总是可用时的最佳实践

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM