Python 如何在不初始化GPU的情况下使我的包可导入

Python 如何在不初始化GPU的情况下使我的包可导入,python,python-sphinx,python-import,pycuda,Python,Python Sphinx,Python Import,Pycuda,我正在编写一个Python包,它使用PyCUDA库进行GPU计算。PyCUDA需要初始化GPU设备(通常通过导入PyCUDA.autoinit)才能导入其任何子模块 在我自己的模块中,我从PyCUDA导入我需要的任何子模块和函数,这意味着我自己的模块在没有初始化PyCUDA之前是不可导入的。这基本上没问题,因为如果没有GPU,我的软件包就没有任何用处。但是,现在我想编写文档,Sphinx Autodoc需要导入我的包来读取文档字符串。如果我将import pycuda.autoinit放入doc

我正在编写一个Python包,它使用PyCUDA库进行GPU计算。PyCUDA需要初始化GPU设备(通常通过导入
PyCUDA.autoinit
)才能导入其任何子模块

在我自己的模块中,我从PyCUDA导入我需要的任何子模块和函数,这意味着我自己的模块在没有初始化PyCUDA之前是不可导入的。这基本上没问题,因为如果没有GPU,我的软件包就没有任何用处。但是,现在我想编写文档,Sphinx Autodoc需要导入我的包来读取文档字符串。如果我将
import pycuda.autoinit
放入
docs/conf.py
中,它可以正常工作,但是我希望文档可以在没有NVIDIA GPU的机器上构建,比如我自己的笔记本电脑或readthedocs.org


延迟导入依赖项的最优雅方式是什么,这样我就可以在没有安装所有依赖项的机器上导入自己的子模块?

我见过的常用方法是使用模块级函数,如
foo.init()
设置GPU/显示/运行时需要但不希望在导入时自动初始化的任何内容

你也可以考虑在这里公开初始化选项:如果我有2个CUDA能力的GPU,但是只想使用其中一个呢?< /P> < P>这个机制要求所有被记录的模块都是可输入的。当这个需求成为一个问题时,模拟(用替换系统的一部分)可以是一个解决方案

这里有一篇文章解释了在使用Sphinx时如何使用模拟对象:

本文的要点是,如果在conf.py中添加类似的内容,它应该可以工作:

import mock   # See http://www.voidspace.org.uk/python/mock/

MOCK_MODULES = ['module1', 'module2', ...]
for mod_name in MOCK_MODULES:
    sys.modules[mod_name] = mock.Mock()

您使用哪种机制来处理文档字符串<代码>。。automodule::mymodule下面有
:成员:
?例如,是的。基本上,我正在寻找使我自己的所有模块/类/函数都可导入的最佳方法,同时将引用GPU的所有模块的导入推迟到运行时。事实上,这正是我需要的。你应该将此作为答案发布。