我正在编写一个使用PyCUDA库进行GPU计算的Python包。 PyCUDA需要在导入任何子模块之前初始化GPU设备(通常通过导入pycuda.autoinit
)。
在我自己的模块中,我从PyCUDA导入了我需要的任何子模块和函数,这意味着如果没有首先初始化PyCUDA,我自己的模块就无法导入。这很好,因为没有GPU存在我的包没有任何用处。但是,现在我想编写文档,Sphinx Autodoc需要导入我的包来阅读文档字符串。如果我将import pycuda.autoinit
放入docs/conf.py
,它的工作正常,但我希望文档可以在没有NVIDIA GPU的机器上构建,例如我自己的笔记本电脑或readthedocs.org。
推迟导入依赖项的最优雅方法是什么,以便我可以在没有安装所有依赖项的计算机上导入我自己的子模块?
答案 0 :(得分:1)
我见过的常用方法是使用像foo.init()
这样的模块级函数来设置GPU / display /在运行时需要的任何内容,但不希望在导入时自动初始化。
您也可以考虑在这里公开初始化选项:如果我有2个支持CUDA的GPU,但只想使用其中一个,该怎么办?
答案 1 :(得分:1)
autodoc机制要求所有要记录的模块都是可导入的。当此要求出现问题时,模拟(用mock objects替换系统的某些部分)可能是一种解决方案。
这篇文章解释了在使用Sphinx时如何使用模拟对象:http://blog.rtwilson.com/how-to-make-your-sphinx-documentation-compile-with-readthedocs-when-youre-using-numpy-and-scipy/。
文章的要点是,如果你将这样的东西添加到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()