我正在编写一个使用 PyCUDA 库进行 GPU 计算的 Python 包。 PyCUDA 需要先初始化 GPU 设备(通常通过导入 pycuda.autoinit ),然后才能导入其任何子模块。
在我自己的模块中,我从 PyCUDA 导入我需要的任何子模块和函数,这意味着如果不首先初始化 PyCUDA,我自己的模块就无法导入。这基本上没什么问题,因为如果没有 GPU,我的包就没有任何用处。但是,现在我想编写文档,Sphinx Autodoc 需要导入我的包来读取文档字符串。如果我将 import pycuda.autoinit
放入 docs/conf.py
中,效果很好,但我希望文档可以在没有 NVIDIA 的计算机上构建GPU,例如我自己的笔记本电脑或 readthedocs.org。
推迟导入我的依赖项的最优雅的方法是什么,以便我可以在未安装所有依赖项的计算机上导入我自己的子模块?
最佳答案
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()
关于python - 如何在不初始化 GPU 的情况下使我的包可导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20207039/