我想加載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
- 刪除那些沒有在進口之前是一個非常哈克的方式對我的所有模塊。
- 當具有名稱的模塊已經存在時,它不會重新加載。
- 我無法加載任意文件,甚至無法加載內存。
由於安全原因,我試圖避免exec
聲明。由exec
評估的來源可能使用sys._getframe()
侵入我的應用程序(並且確實有更多的可能性)。我已經查看了django load
標籤的實現,但也只是使用__import_()
。
有沒有一種方法可以從文件(甚至是內存)加載Python代碼(無論是源代碼還是二進制文件),這是安全的,自包含的(不添加與sys.modules
的交互)?在最好的情況下,它不僅允許我從內存中加載文件,而且還加載一個完整的包,如__import__()
函數。
我認爲這個詞'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