2015-10-19 54 views
0

某些圖書館確實以我不想要的方式更改了我的sys.pathsys.path在哪裏被替換?

但我找不到它。受影響的virtualenv安裝了很多庫。

我替換爲自己的類,它改變了修改sys.path中,但是這並沒有幫助,因爲代碼似乎改變sys.path這樣的:

sys.path= [...] + sys.path 

我如何才能找到「邪惡」的代碼線和它的堆棧跟蹤?

相關

回答

1

我發現邪惡的代碼行這樣。

我改變sys.globals [ 'SYS'〕中sitecustomize.py:

# sitecustomize.py 
import sys 

class AttributeIsReadonly(ValueError): 
    pass 

class MakeModuleAttributesReadonly(object): 
    def __init__(self, module, readonly_attributes): 
     self.module=module 
     self.readonly_attributes=readonly_attributes 

    def __setattr__(self, item, value): 
     if item in ['module', 'readonly_attributes']: 
      return super(MakeModuleAttributesReadonly, self).__setattr__(item, value) 
     if item in self.readonly_attributes: 
      raise AttributeIsReadonly('Access on attribute %r is readonly' % item) 
     return setattr(self.module, item, value) 

    def __getattr__(self, item): 
     return getattr(self.module, item) 

sys.modules['sys']=MakeModuleAttributesReadonly(sys, ['path']) 

#import sys 
#sys.path=sys.path # this will raise the above AttributeIsReadonly 

它提高AttributeIsReadonly和我看到的代碼線和堆棧跟蹤。

+0

爲什麼你不加上這個作爲現有問題的替代答案? – jonrsharpe

+1

由於在目前的問題sys.path沒有得到**修改**。這是一個不同的問題。它有關但不相同。 – guettli

+0

但是當然在同一個地方有兩個答案會對其他用戶更有幫助嗎?修改和替換列表在技術上是不同的,但是你正在解決同樣的基本問題。請注意,你也可以通過在'VerboseSysPath'中實現'__add__'來解決這個問題。 – jonrsharpe