2015-02-10 30 views

回答

6

一個進口的第一件事情是sitecustomizeusercustomize模塊;您可以使用自定義列表實施來替換sys.path,該自定義列表實施可記錄正在進行的所有更改。

首先,找到在哪裏放置usercustomizesitecustomize模塊;該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列表。

演示,在上述放置在任一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

不工作'sys.path [:] = ....':-( – guettli 2015-05-11 07:00:15

+0

@guettli:在['object .__ setslice__()']中添加(https://docs.python.org/2/reference /datamodel.html#object.__setslice__)(僅適用於Python 2),以捕捉該案例。 – 2015-05-11 07:35:13

+0

你比光更快:-) – guettli 2015-05-11 08:33:48

0

python -S原因蟒開始蟒不加載site.py,所以它的默認值是從當蟒第一啓動保存。