调试sys.path的修改

gue*_*tli 2 python path

有些图书馆似乎修改了我sys.path,虽然我不想改变.

我怎样才能找到改变的python代码行sys.path

有关

Mar*_*ers 7

导入的第一件事是sitecustomizeusercustomize模块; 您可以替换sys.path为记录所有更改的自定义列表实现.

首先,找到放置usercustomizesitecustomize模块的位置; 该site模块可以告诉你在什么地方,第一:

python -m site --user-site
Run Code Online (Sandbox Code Playgroud)

如果该目录尚不存在,请创建它并在其中放置一个usercustomize.py:

import sys

class VerboseSysPath(list):
    def croak(self, action, args):
        frame = sys._getframe(2)
        print('sys.path.{}{} from {}:{}'.format(
            action, args, frame.f_code.co_filename, frame.f_lineno))

    def insert(self, *args):
        self.croak('insert', args)
        return super(VerboseSysPath, self).insert(*args)

    def append(self, *args):
        self.croak('append', args)
        return super(VerboseSysPath, self).append(*args)

    def extend(self, *args):
        self.croak('extend', args)
        return super(VerboseSysPath, self).extend(*args)

    def pop(self, *args):
        self.croak('pop', args)
        return super(VerboseSysPath, self).pop(*args)

    def remove(self, *args):
        self.croak('remove', args)
        return super(VerboseSysPath, self).pop(*args)

    def __delitem__(self, *args):
        self.croak('__delitem__', args)
        return super(VerboseSysPath, self).__delitem__(*args)

    def __setitem__(self, *args):
        self.croak('__setitem__', args)
        return super(VerboseSysPath, self).__setitem__(*args)

    def __setslice__(self, *args):
        self.croak('__setslice__', args)
        return super(VerboseSysPath, self).__setslice__(*args)

sys.path = VerboseSysPath(sys.path)
Run Code Online (Sandbox Code Playgroud)

现在这将抱怨改变sys.path名单的所有尝试.

演示,上面放置在site-packages/sitecustomize.py`python -m site --user-site`/usercustomize.py模块中:

$ cat test.py 
import sys

sys.path.append('')
$ bin/python test.py 
sys.path.append('',) from test.py:3
Run Code Online (Sandbox Code Playgroud)