2015-02-10 4 views
1

Некоторая библиотека, похоже, меняет мой sys.path, хотя я не хочу, чтобы меня не изменяли.Отладка модификаций sys.path

Как найти строку кода python, которая изменяет sys.path?

Связанных

+0

Вы можете сначала проверить 'sys.path', затем импортировать модуль и снова проверить его. – ForceBru

ответ

6

Одна из первых вещей, ввезенных являются sitecustomize и usercustomize модулей; вы можете заменить sys.path на реализацию пользовательского списка, в котором записаны все сделанные изменения.

Сначала найдите, где разместить модуль usercustomize или sitecustomize; site module может сказать вам, где поместить первый:

python -m site --user-site 

Если этот каталог еще не существует, создайте его и в нем поставить 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) 

Это теперь будет жаловаться на все попытки изменить список sys.path.

Demo, с вышесказанным, помещаемыми или в 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 
+0

Не работает work 'sys.path [:] = ....' :-( – guettli

+0

@guettli: Добавлено в ['object .__ setslice__()'] (https://docs.python.org/2/reference /datamodel.html#object.__setslice__) (только для Python 2), чтобы поймать этот случай. –

+0

вы быстрее света :-) – guettli

0

Начиная питон с python -S причинами питона не загружать site.py, и поэтому его значение по умолчанию сохраняется с моментом, когда питон первого запуска.

Смежные вопросы