2013-03-18 62 views
1

我想加載Python代碼(如果可能的話使用任意文件擴展名,甚至從內存,源代碼或二進制文件中加載),而無需將其添加到sys.modules。使用imp.load_source可以加載文件,但返回的模塊將添加到sys.modules,甚至可能會與現有模塊結合使用(請參閱this question)!加載Python源代碼/二進制文件而不添加到sys.modules

所以,我目前正在做的是使用內置的__import__()。雖然它允許我從包中導入,但我無法加載任意文件。

try: 
    m = __import__(name) 
    for n in name.split('.')[1:]: 
     m = getattr(m, n) 
    return m 
except: 
    raise 
finally: 
    # Restore the old module configuration. Only modules that have 
    # not been in sys.path before will be removed. 
    for k, v in sys.modules.items(): 
     if k not in prev_modules and self.is_local(v) or not v: 
      del sys.modules[k] 
     else: 
      sys.modules[k] = v 
  1. 刪除那些沒有在進口之前是一個非常哈克的方式對我的所有模塊。
  2. 當具有名稱的模塊已經存在時,它不會重新加載。
  3. 我無法加載任意文件,甚至無法加載內存。

由於安全原因,我試圖避免exec聲明。由exec評估的來源可能使用sys._getframe()侵入我的應用程序(並且確實有更多的可能性)。我已經查看了django load標籤的實現,但也只是使用__import_()

有沒有一種方法可以從文件(甚至是內存)加載Python代碼(無論是源代碼還是二進制文件),這是安全的,自包含的(不添加與sys.modules的交互)?在最好的情況下,它不僅允許我從內存中加載文件,而且還加載一個完整的包,如__import__()函數。

+0

我認爲這個詞'secure'和'自contained'這裏是一個不可能的組合。 AFAIK,導入一個python模塊有效地執行它。我所知道的最接近的是https://seattle.cs.washington.edu/browser/seattle/branches/repy_v2/repy/safe.py,它試圖構建一個安全的exec。它基於靜態分析代碼並刪除對「危險」內置的訪問。 – Moshe 2013-03-18 12:48:41

回答