2015-06-20 3 views
1

У меня есть небольшой модуль Windows, который опирается на ctypes. На сайте RTD проекта страница для модуля появляется пустым. Рассматривая последний почти успешный журнал построения https://readthedocs.org/builds/apt/2900858/, есть ошибка во время make html stage.Ошибка при загрузке ctypes с неподдерживаемым операндом на Read The Docs

File "/var/build/user_builds/apt/checkouts/latest/knownpaths.py", line 5, in <module> 
    from ctypes import windll, wintypes 
    File "/usr/lib/python2.7/ctypes/wintypes.py", line 23, in <module> 
    class VARIANT_BOOL(_SimpleCData): 
ValueError: _type_ 'v' not supported 

После вступления Справки https://read-the-docs.readthedocs.org/en/latest/faq.html#i-get-import-errors-on-libraries-that-depend-on-c-modules Я попытался подделать импорт ctypes использования mock, но при этом привести к выпадению сборки полностью. Из того, что я могу сказать, но я не означает, что специалист в этой области, это потому, что издеваться сам отсутствуют некоторые математические функции:

File "/var/build/user_builds/apt/checkouts/latest/knownpaths.py", line 13, in GUID 
    ("Data4", wintypes.BYTE * 8) 
TypeError: unsupported operand type(s) for *: 'Mock' and 'int' 

Исследования на ошибки приводит лишь 3 поисковых попаданий, наиболее релевантные о Отсутствует (по крайней мере) истинный оператор деления: https://mail.python.org/pipermail/python-bugs-list/2014-March/235709.html

Я следую правой дорожке? Может ли ctypes использоваться в проекте по RTD, и мне просто нужно упорствовать, или мне нужно отказаться и просто использовать sphinx с моей локальной машины?

Вот текущий макет блок из my conf.py:

try: 
    #py3 import 
    from unittest.mock import MagicMock 
except ImportError: 
    #py27 import 
    from mock import Mock as MagicMock 

class Mock(MagicMock): 
    @classmethod 
    def __getattr__(cls, name): 
     return Mock() 

MOCK_MODULES = ['ctypes'] 
sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES) 

// это крест сообщение от https://github.com/rtfd/readthedocs.org/issues/1342. Нулевые ответы после недели, так что я смотрю дальше. //

+0

Как создается 'wintypes.BYTE' (вы не сказали, как вы издевались над' ctypes')? Это должен быть объект MagicMock, а не объект 'Mock'. (или вам нужно настроить магический метод '__mul__' на вашем издеваемом объекте. http://www.voidspace.org.uk/python/mock/magicmock.html#magic-mock – Dunes

+0

sorry @Dunes, не знаю, как Ответ: Я еще не добавил какой-либо макет кода, кроме опубликованного выше, как часть Sphinx conf.py. За исключением попытки: кроме: для py2/3 он идентичен частоте RTD о том, как использовать mock. «Прочитайте страницу, которую вы связали, но все это на моей голове. –

+0

как для создания' wintypes.BYTE', это [здесь] (https://github.com/maphew/apt/blob/master/knownpaths .py # L13) и включен в исходное дерево моего модуля. –

ответ

1

Первоначально я думал, что это был сам ctypes, что нужно быть издевался, но получается, что мне нужно работать ближе к дому и макета модуля, который вызовов ctypes, не ctypes себя.

- MOCK_MODULES = ['ctypes'] 
+ MOCK_MODULES = ['knownpaths'] 

Спасибо @Dunes, комментарий которого я считал внедорожником и не собираюсь помогать. Однако это дало мне достаточно поворота для моего разума и пути расследования, чтобы посадить меня в нужное место. Не все учения выглядят как учение, когда они сначала издают свое внимание. ;-)

+1

Рад, что я мог бы помочь, даже если бы это было окольным путем. Я должен извиниться за свой комментарий. Я ясно вижу, что вы показали, как вы издевались над ctypes. Кажется, я очень устал. – Dunes