【问题标题】:Where does sys.path get replaced?sys.path 在哪里被替换?
【发布时间】:2015-10-19 10:47:28
【问题描述】:

某些库确实以我不希望的方式更改了我的 sys.path

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

我用自己的类替换了 sys.path 来改变修改,但这没有帮助,因为代码似乎像这样改变sys.path

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

如何找到“邪恶”的代码行及其堆栈跟踪?

相关

【问题讨论】:

    标签: python debugging sys.path


    【解决方案1】:

    我找到了这样的邪恶代码行。

    我在 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 没有得到修改。这是一个不同的问题。相关但不相同。
    • 但是肯定将两个答案放在同一个地方会对其他用户更有帮助吗?列表的修改和替换技术上不同,但您解决的是相同的潜在问题。请注意,您也可以通过在 VerboseSysPath 中实现 __add__ 来解决此问题。
    • @jonrsharpe __add__ 如果修改像这样sys.path = [...] + sys.path 将不起作用。但是感谢您的反馈,我会更新问题。
    • @jonrsharpe:在搜索问题时,使用不同措辞的问题会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 2010-10-28
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多