簡體   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