Как сделать мой пакет доступным для импорта без инициализации графического процессора

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

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

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


person oceanhug    schedule 26.11.2013    source источник
comment
Какой механизм вы используете для обработки строк документации? .. automodule:: mymodule с :members: под ним?   -  person abarnert    schedule 26.11.2013
comment
Да, например. По сути, я ищу лучший способ сделать все мои собственные модули/классы/функции импортируемыми, откладывая импорт всех модулей, относящихся к графическому процессору, до времени выполнения.   -  person oceanhug    schedule 26.11.2013
comment
Издевательство, наверное? stackoverflow.com/a/15912502/407651, stackoverflow.com/a/17369696/407651.   -  person mzjn    schedule 26.11.2013
comment
Это то, что мне было нужно, на самом деле. Вы должны опубликовать это как ответ.   -  person oceanhug    schedule 27.11.2013


Ответы (2)


Механизм autodoc требует, чтобы все модули, подлежащие документированию, были импортируемы. Если это требование является проблемой, имитация (замена частей системы фиктивными объектами) может быть решение.

Вот статья, объясняющая, как можно использовать фиктивные объекты при работе со Sphinx: http://blog.rtwilson.com/how-to-make-your-sphinx-documentation-compile-with-readthedocs-когда-вы-используете-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()
person mzjn    schedule 27.11.2013

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

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

person Colin Valliant    schedule 26.11.2013