2016-05-16 75 views
2

我有一個問題,我想在兩個不同的文件中使用git(gitpython)回購。然而,我不能想出一種克隆它的巧妙方法,然後在模塊之間共享對象。回購非常大,所以每次我需要訪問該對象時克隆它們都不是最佳選擇。克隆git存儲庫並在其他地方導入對象

我已經嘗試在名爲utils.py的文件中創建一個類和它的一個實例。然而,即使它應該在utils.py中的__init__類中發生,但我在導入它們時似乎沒有克隆回購。當然,這必須是一些Python安全措施,以防止進口。

我已經嘗試了繼承字典和使用__getattr__克隆時訪問,如果它還沒有,但它沒有奏效。它似乎只是進口,但像以前一樣跳過克隆。

這是我需要utils.py定義,這樣我可以在其他地方導入:

compiler_repo = git.Repo.clone_from(someurl, somepath)

回答

1

中的代碼初始化是運行像任何其他的Python代碼。如果你在其中放入一個無限循環或阻塞等待,那麼導入確實可以掛起。

通過將昂貴的初始化代碼放入由應用程序調用的函數中,可以最大限度地減少庫的啓動時間。它不會改變要完成的工作量,但至少工作的時間是在應用程序的控制之下,並且將更容易弄清楚發生了什麼問題(失敗初始化代碼可能很難調試)。

有多種方法可以隱藏初始化步驟。例如,你可以定義一個類延遲加載:

class RepoLoader: 
    def __init__(self, url, path): 
     self.url = url 
     self.path = path 
     self._repo = None 

    def fetch_repo(self): 
     self._repo = git.Repo.clone_from(self.url, self.path) 

    @property 
    def repo(self): 
     if self._repo is None: 
      self.fetch_repo() 
     return self._repo 

compiler = RepoLoader(someurl, somepath) 

其他地方你的包,你可以使用要求回購:

from . import utils 
compiler_repo = utils.compiler.repo 

現在包的用戶可以撥打utils.compiler.fetch_repo()作爲初始化步驟,如果他們想要控制何時發生,或者他們可以將其留給應用程序。多花點功夫就可以將fetch_repo放在一個單獨的線程中,這樣應用程序初始化的其餘部分就可以繼續進行了,只有當代碼需要回購時纔會阻止。