Python 模拟依赖项的依赖项

Python 模拟依赖项的依赖项,python,mocking,setuptools,read-the-docs,Python,Mocking,Setuptools,Read The Docs,设想以下场景:您有一个名为“foo”的python包,它依赖于“bar”。包“bar”本身依赖于另一个python包,比如说shapely,它依赖于一个C库。因此,“酒吧”以漂亮的方式嘲弄着 class Mock(MagicMock): @classmethod def __getattr__(cls, name): return MagicMock() MOCK_MODULES = ['shapely', 'shapely.wkt', 'shapely

设想以下场景:您有一个名为“foo”的python包,它依赖于“bar”。包“bar”本身依赖于另一个python包,比如说shapely,它依赖于一个C库。因此,“酒吧”以漂亮的方式嘲弄着

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

MOCK_MODULES = ['shapely', 'shapely.wkt', 'shapely.wkb', 'shapely.geometry', 'shapely.ops']
sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES)
在conf.py文件中

现在,我想从“bar”中巧妙地模拟出依赖关系,但仍然在RTD上安装“bar”,以便正确地构建“foo”的文档。 我如何告诉readthedocs.io合理地模拟“bar”的依赖关系?

对于环境变量
readthedocs

import os
if 'READTHEDOCS' in os.environ:
    class Mock(MagicMock):
        @classmethod
        def __getattr__(cls, name):
                return MagicMock()

    MOCK_MODULES = ['shapely', 'shapely.wkt', 'shapely.wkb', 'shapely.geometry', 'shapely.ops']
    sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES)
对于环境变量
读取DOCS

import os
if 'READTHEDOCS' in os.environ:
    class Mock(MagicMock):
        @classmethod
        def __getattr__(cls, name):
                return MagicMock()

    MOCK_MODULES = ['shapely', 'shapely.wkt', 'shapely.wkb', 'shapely.geometry', 'shapely.ops']
    sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES)

谢谢你的提示!更准确地理解它。您是否建议在上述场景中为依赖项“条”添加此检查?因此,我不会模仿‘bar’本身,但‘bar的conf.py’会模仿得很漂亮,对吧?这应该行得通。您可以通过删除已编译的扩展名并亲自传递环境变量
READTHEDOCS
来进行本地测试。实际上我不知道如何在本地测试它:(.但我尝试了在os.environ:中使用RTD的
方法。遗憾的是,它没有效果。问题仍然是我必须在RTD_requirements.txt中指定“bar”作为所需的依赖项,以便在RTD上安装我的包。然后,“bar”触发shapely的安装,整个过程失败。我认为我的问题是我对模拟的工作原理没有足够的了解。它会影响RTD上的安装过程吗?如果检测到“READTHEDOCS”,请将
bar
requirements.txt
移动到
setup.py
。Mock
Shapely
期间
setup.py install
。感谢您的指导。目前为止的效果是:'bar'and Shapely没有安装在RTD上。但是,这引发了另一个问题:现在API文档没有生成,因为'bar'和Shapely的导入无法在某些文件中导入。因此,我像模拟导入一样。现在我问:有没有更优雅的方法来实现这一点?但这可能是另一个线程的问题…感谢提示!了解它没错。你建议在上面描述的场景中为依赖项“bar”添加此检查吗?因此,我不会模拟“bar”本身,但“bar的conf.py模拟shapely,对吧?”这应该会起作用。你可以通过删除已编译的扩展名并亲自传递环境变量
READTHEDOCS
来进行本地测试。实际上,我不了解如何在本地进行测试:(.但我尝试了在os.environ:
中使用RTD的
方法。遗憾的是,它没有效果。问题仍然是我必须在RTD_requirements.txt中指定“bar”作为所需的依赖项,以便在RTD上安装我的包。然后,“bar”触发shapely的安装,整个过程失败。我认为我的问题是我对模拟的工作原理没有足够的了解。它会影响RTD上的安装过程吗?如果检测到“READTHEDOCS”,请将
bar
requirements.txt
移动到
setup.py
。Mock
Shapely
期间
setup.py install
。感谢您的指导。目前为止的效果是:'bar'and Shapely没有安装在RTD上。但是,这引发了另一个问题:现在API文档没有生成,因为'bar'和Shapely的导入无法在某些文件中导入。因此,我模仿导入。现在我问:有没有更优雅的方法来实现这一点?但这可能是另一个线程的问题。。。