2013-11-26 2 views
1

Я пишу пакет Python, который делает вычисления на GPU, используя библиотеку PyCUDA. PyCUDA необходимо инициализировать устройство GPU (обычно путем импорта pycuda.autoinit), прежде чем любой из его подмодулей можно импортировать.Как сделать мой пакет доступным без инициализации GPU

В моих собственных модулях я импортирую любые подмодули и функции, которые мне нужны из PyCUDA, а это значит, что мои собственные модули не являются импортируемыми без предварительной инициализации PyCUDA. Это нормально, потому что мой пакет ничего не полезен без присутствия GPU. Однако теперь я хочу написать документацию, и Sphinx Autodoc необходимо импортировать мой пакет, чтобы прочитать docstrings. Он отлично работает, если я положил import pycuda.autoinit в docs/conf.py, но хотел бы, чтобы документация была построена на машинах, на которых нет графических процессоров NVIDIA, таких как мой собственный ноутбук или readthedocs.org.

Что является самым элегантным способом отложить импорт моих зависимостей, чтобы я мог импортировать свои собственные подмодули на машинах, на которых не установлены все зависимости?

+0

Какой механизм вы используете для обработки ваших строк документации? '.. automodule :: mymodule' с': members: 'под ним? – abarnert

+0

Да, например. В принципе, я ищу лучший способ сделать все мои собственные модули/классы/функции импортируемыми, откладывая импорт всех модулей, относящихся к GPU, до времени исполнения. – oceanhug

+0

Скучно, может быть? http://stackoverflow.com/a/15912502/407651, http://stackoverflow.com/a/17369696/407651. – mzjn

ответ

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() 
1

Обычный метод, который я видел, - это функция уровня модуля, такая как foo.init(), которая настраивает графический процессор/дисплей/все, что вам нужно во время выполнения, но не требует автоматической инициализации при импорте.

Возможно, вам также стоит рассмотреть возможность инициализации здесь: что делать, если у меня есть два графических процессора с поддержкой CUDA, но только хотите использовать один из них?

Смежные вопросы