2015-06-20 53 views
1

我有一个小型Windows模块,它依赖于ctypes核心模块。在项目RTD站点上,该模块的页面为空。看看最近几乎成功的构建日志https://readthedocs.org/builds/apt/2900858/使html阶段失败。ctypes的模拟导入失败,操作数不受支持阅读文档

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 

继FAQ条目https://read-the-docs.readthedocs.org/en/latest/faq.html#i-get-import-errors-on-libraries-that-depend-on-c-modules我使用mock,但这样做导致构建完全失败试图假冒进口ctypes的。从我所知道的,但我绝不是在这方面的专家,这是因为嘲笑本身缺少一些数学函数:在错误导致只有3个搜索命中,最相关的约

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' 

研究模拟失踪(至少)一个真正的分裂运营商: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

对不起@Dunes,不知道如何除了上面发布的内容之外,我还没有添加任何其他模拟代码,作为Sphinx conf.py的一部分。除了try:除py2/3之外,它与关于如何使用mock的RTD FAQ相同。已经翻阅了你链接的页面,但它已经全部结束了。 –

+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

相关问题