3

我有依赖于ctypes核心模块的小型 Windows 模块。在项目 RTD 站点上,该模块的页面为空。查看最新的几乎成功的构建日志https://readthedocs.org/builds/apt/2900858/在make html阶段出现故障。

  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我试图使用 伪造 import ctypes mock,但这样做会导致构建完全失败。据我所知,但我不是这方面的专家,这是因为 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 次搜索命中,与 Mock 最相关(至少)缺少真正的除法运算符:https://mail.python.org/pipermail/python-bugs-list/2014-March/235709。 html

我走的是正确的道路吗?ctypes 可以在 RTD 上的项目中使用,我只需要坚持,还是我需要放弃并只使用本地机器上的 sphinx?

这是我的 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的交叉帖子。一周后零回复,所以我把目光投向了更远的地方。//

4

1 回答 1

1

最初我认为需要模拟的是 ctypes 本身,但事实证明我需要在离家更近的地方工作并模拟调用 ctypes 的模块,而不是 ctypes 本身

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

感谢@Dunes,我认为他的评论偏离了轨道,无济于事。然而,它让我的思想和调查路径有了足够的转变,最终让我找到了正确的地方。并非所有的教义在第一次引起人们的注意时看起来都像教义。;-)

于 2015-06-21T05:54:44.020 回答