调试sys.path的修改 [英] Debugging modifications of sys.path

查看:160
本文介绍了调试sys.path的修改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有些库似乎修改了我的sys.path,尽管我不想更改它.

Some library seems to modify my sys.path, although I don't want ìt to be changed.

如何找到更改sys.path的python代码行?

How can I find the python code line which alters sys.path?

相关

推荐答案

首先导入的内容之一是sitecustomizeusercustomize模块.您可以将sys.path替换为记录所有所做更改的自定义列表实现.

One of the first things imported is the sitecustomize and usercustomize modules; you could replace sys.path with a custom list implementation that records all changes being made.

首先,找到放置usercustomizesitecustomize模块的位置; site模块可以告诉您将第一个放在哪里:

First, find where to place a usercustomize or sitecustomize module; the site module can tell you where to place the first:

python -m site --user-site

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

If that directory doesn't exist yet, create it and in it put a usercustomize.py with:

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)

现在,这将抱怨所有试图更改sys.path列表的尝试.

This now will complain about all attempts at altering the sys.path list.

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

Demo, with the above placed in either the site-packages/sitecustomize.py or `python -m site --user-site`/usercustomize.py modules:

$ cat test.py 
import sys

sys.path.append('')
$ bin/python test.py 
sys.path.append('',) from test.py:3

这篇关于调试sys.path的修改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆