首先被导入的是sitecustomize
和usercustomize
模块;你可以用自定义的列表实现来替换sys.path
,记录所有正在进行的更改。
首先找到放置usercustomize
或sitecustomize
模块的位置;site
模块可以告诉你如何放置第一个模块:
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().insert(*args)
def append(self, *args):
self.croak('append', args)
return super().append(*args)
def extend(self, *args):
self.croak('extend', args)
return super().extend(*args)
def pop(self, *args):
self.croak('pop', args)
return super().pop(*args)
def remove(self, *args):
self.croak('remove', args)
return super().remove(*args)
def __delitem__(self, *args):
self.croak('__delitem__', args)
return super().__delitem__(*args)
def __setitem__(self, *args):
self.croak('__setitem__', args)
return super().__setitem__(*args)
sys.path = VerboseSysPath(sys.path)
现在,任何尝试更改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
sitecustomize.py
来跟踪sys.path
中未解释的条目,因此我最终临时将其破解到site.py
本身中,并成功解决了问题(残留的.pth文件来自有缺陷的安装)。 site.py
位于lib
文件夹中。值得注意的是;如果您使用虚拟环境,则核心库不会随附,只有lib/site-packages
。您可以通过查看sys.path
中前几个条目来找到基本安装位置。 - MarcinKonowalczyk.pth
文件在导入*customize
模块之前被处理。请注意,用户级别的site-packages目录中的.pth
文件会在site目录中的文件之前加载,并且在这样的文件中以import
开头的任何行都会被执行,因此您可以使用.pth
文件来代替usercustomize
模块来加载相同的sys.path
工具,并且不需要修改site.py
。 - Martijn Pieterspython -S
启动 Python 会导致 Python 不加载 site.py
,因此它的默认值会保留自 Python 第一次启动时的值。
sys.path
,然后导入模块并再次检查它。 - ForceBru