sys.path在哪里被替换?

时间:2015-10-19 10:47:28

标签: python debugging sys.path

某些图书馆确实以我不想要的方式更改了我的sys.path

但我无法找到它。受影响的virtualenv安装了很多库。

我用自己的类替换了sys.path,它改变了修改,但这没有用,因为代码似乎改变了sys.path,如下所示:

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

我怎样才能找到" evil"代码行及其堆栈跟踪?

相关

1 个答案:

答案 0 :(得分:2)

我发现了这样的邪恶代码行。

我改变了sitecustomize.py中的sys.globals [' sys']:

# 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,我看到了代码行和堆栈跟踪。