2017-09-04 258 views
0

想象一下以下情形:您有一個名爲'foo'的python包依賴於'bar'。包'bar'本身依賴於另一個python包,讓我們來形容,這取決於一個C庫,其中cannot be installed on readthedocs.io。因此,'bar'在conf.py文件中被模擬依賴關係的依賴關係

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'模擬出依賴關係,但仍然在RTD上安裝'bar',以便正確構建'foo'文檔。 我怎樣才能讓readthedocs.io模擬出酒吧的依賴性?

回答

2

Check的環境變量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) 
+0

謝謝你的提示!更準確地理解它。你會推薦在上面描述的場景中爲這個依賴項'bar'添加這個檢查嗎?因此,我不會嘲笑'酒吧'本身,但'酒吧conf.py嘲笑出來,對吧? – gplssm

+0

這應該工作。你可以通過自己去除已編譯的擴展和傳遞環境變量'READTHEDOCS'來在本地測試。 – phd

+0

其實我不明白如何在本地進行測試:(。但是我嘗試着在os.environ中提供'如果'READTHEDOCS'的方法:'用RTD。可悲的是,它沒有效果。問題仍然是我有在rtd_requirements.txt中指定'bar'作爲所需依賴項,以便在RTD上安裝我的包,然後'bar'觸發整型安裝,整個過程失敗。我認爲我的問題是我沒有足夠的瞭解這個模擬的工作原理,它是否會影響RTD上的安裝過程? – gplssm