Некоторая библиотека, похоже, меняет мой sys.path
, хотя я не хочу, чтобы меня не изменяли.Отладка модификаций sys.path
Как найти строку кода python, которая изменяет sys.path
?
Связанных
Некоторая библиотека, похоже, меняет мой sys.path
, хотя я не хочу, чтобы меня не изменяли.Отладка модификаций sys.path
Как найти строку кода python, которая изменяет sys.path
?
Связанных
Одна из первых вещей, ввезенных являются 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
Начиная питон с python -S
причинами питона не загружать site.py
, и поэтому его значение по умолчанию сохраняется с моментом, когда питон первого запуска.
Вы можете сначала проверить 'sys.path', затем импортировать модуль и снова проверить его. – ForceBru