由于我设法解决了一个特定的problem,我今天花了大部分时间来弄清楚site.py是如何工作的。有一点我不明白。
据我所知,加载python时,首先运行lib/python2.7/site-packages/site.py
。它会越过PYTHONPATH
,搜索lib/python2.7/site.py
并导入它。此文件具有addsitedir
方法,不仅可以添加sys.path
的路径,还可以处理其中存在的*.pth
个文件。此时,main()
的{{1}}已运行,lib/python2.7/site.py
在网站包和用户网站包上运行。
现在出现了奇怪的部分。现在我们回到addsitedir
,它遍历pythonpath中的每条路径,并在其上运行lib/python2.7/site-packages/site.py
。我发现这很奇怪有两个原因:
addsitedir
在addsitedir
上运行两次。lib/python2.7/site-packages
有一个机制允许雄心勃勃的用户通过实现{来操纵lib/python2.7/site.py
{1}}模块(嘿,它甚至在docs中)。显然,当您实现这样的机制时,您希望确保用户最后进入,因此他可以控制添加到sys.path
的所有内容。但这不是这种情况(因为我很难找到)。最有可能的是,对usercustomize
的第二次调用将覆盖sys.path
。我知道这很糟糕,但是我向lib/python2.7/site-packages
添加了一个打印声明,打印了它收到的路径,这样我就可以显示正在发生的事情。这些是处理的路径:
usercustomize
那我在这问什么? :)
一个。我很欣赏为什么需要第二次调用站点包。
B中。是addsitedir
确实有限,因为我认为这是由于这个实施?考虑到这一点,你将如何从sys.path中实现删除路径(理论上)?
请求的调试输出:
/home/user/.local/lib/python2.7/site-packages #lib/python2.7/site.py
/home/user/py/lib/python2.7/site-packages #lib/python2.7/site.py
#This is where your usercustomize runs
#Followin calls are from lib/python2.7/site-packages/site.py
/home/user/py/lib/python2.7/site-packages/numpy-1.9.0-py2.7-linux-x86_64.egg
/home/user/Develop/Python/myproject
/home/user/lmfit-0.7.2
/home/user/py/lib/python2.7/site-packages #NOTE: this runs a second time
usercustomize
的输出为here
答案 0 :(得分:9)
lib/python2.7/site-packages/site.py
文件未正常加载。这是因为将lib/python2.7/site.py
路径添加到site-packages
开始sys.path
以及site.py
site-packages
是site.py
的工作根本不可见。如果site-packages
中有sys.path
,那么这是一个错误,那里应该没有这样的文件。
没有修补的Python会发生什么:
site-packages
开始。 PYTHONPATH
不属于此列表,除非您设置了包含它的site.py
变量。sys.path
,它会导致lib/python2.7/site.py
上首先列出的那个。site.py
site-packages
将sys.path
添加到site.py
那就是它,没有加载更多的sys.modules['site']
模块。即使您尝试过,也会找到已导入的模块; lib/python2.7/site.py
存在并保存从setuptools
加载的对象。
但是,您的安装安装了较早的easy_install
,其中包含special version of site.py
,site.py
命令will install into site-packages
(如果尚未出现)。它会通过使用loading the original site.py
module manually和{{imp.find_module()
显式扫描原始sys.path
,并忽略任何PYTHONPATH
提供的路径并imp.load_module()
来加载原始sys.path
3}}低级函数,从而绕过正常的模块缓存。
其意图是更改PYTHONPATH
订单,以便为.pth
列出的setuptools
个文件提供更高的优先级,请参阅original commit adding the patch:
注意:此版本包含一个被黑客攻击的网站。'支持处理 在sys.path上的 site-packages之前的目录中的.pth文件。
该修补程序已完全从最新的lib/python2.7/site-packages
版本as early as 2006 in the original setuptools
中删除。
因此,您的Linux发行版已经设置为将PYTHONPATH
添加到您的setuptools
,或者您的shell已经为您设置了这个,或者您的Python已经修补以包含它,并且您拥有旧版site-packages
'补丁'在{{1}}中。
删除该文件完全安全。