sys.path 在哪里被替换?
Where does sys.path get replaced?
有些图书馆确实以我不希望的方式改变了我的 sys.path
。
但是我找不到。受影响的 virtualenv 安装了很多库。
我用自己的 class 替换了 sys.path,这改变了修改,但这无济于事,因为代码似乎像这样改变 sys.path
:
sys.path= [...] + sys.path
如何找到 "evil" 代码行及其堆栈跟踪?
相关
我找到了这样的邪恶代码行。
我在 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
并且我看到了代码行和堆栈跟踪。
有些图书馆确实以我不希望的方式改变了我的 sys.path
。
但是我找不到。受影响的 virtualenv 安装了很多库。
我用自己的 class 替换了 sys.path,这改变了修改,但这无济于事,因为代码似乎像这样改变 sys.path
:
sys.path= [...] + sys.path
如何找到 "evil" 代码行及其堆栈跟踪?
相关
我找到了这样的邪恶代码行。
我在 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
并且我看到了代码行和堆栈跟踪。