Python 的 'Extras' 和 'site-packages' 目录有什么区别?

2 投票
1 回答
1279 浏览
提问于 2025-04-17 15:54

我对在OS X上,Python是如何使用“Extras”和“site-packages”这两个文件夹的有些困惑。特别是,我对这些目录里的内容感到困惑,以及这些目录里重复的包是如何相互影响的,还有我应该把安装的包放在哪里。

我原本以为“Extras”1是用来存放那些不是Python核心部分的包,但仍然会和特定平台一起分发的包。例如,OS X自带了PyObjCtwistednumpy等,这些包都在“Extras”里。我还以为“site-packages”2是我后续安装的包放的地方,并且在一台“全新”的机器上,这个目录是空的或者不存在的。此外,我还认为安装一个新包会让“Extras”里的版本保持不变,而把我更新的内容放在“site-packages”里,这样“site-packages”里的包会“遮盖”掉“Extras”里的包。(所以比如说,默认安装的内容可以通过删除“site-packages”来恢复。)

让我困惑的是,我的“Extras”目录里的内容在减少。和一台全新安装的OS X(10.8.2)相比,我当前配置的“Extras”里缺少了一些内容

altgraph
altgraph-0.9-py2.7.egg-info
dateutil
macholib
macholib-1.4.2-py2.7.egg-info
modulegraph
modulegraph-0.9.1-py2.7.egg-info
numpy #though numpy-1.6.1-py2.7.egg-info is there
pkg_resources.py  # though .pyc is there
py2app
py2app-0.6.3-py2.7.egg-info
setuptools  # though setuptools-0.6c12dev_r88846-py2.7.egg-info is there
site.py  # though .pyc and .pyo are there
xattr
xattr-0.6.2-py2.7.egg-info
zope
zope.interface-3.5.1-py2.7.egg-info

而且还有两个在全新安装中找不到的额外文件

pkg_resources.py.OLD.1356069438.31
setuptools-0.6c12dev_r88846-py2.7.egg-info.OLD.1356069438.31
setuptools.OLD.1356069438.31

据我记得,这些都是我自己更新过的包,所有的版本都在“site-packages”里。

那么,“Extras”目录里的内容真的应该以这种方式“减少”吗?更新一个在“Extras”里的包会把它“移动”到“site-packages”吗?还是说“Extras”里的版本应该保持不变,仅仅被“site-packages”里的包“遮盖”?


1:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
2: /Library/Python/2.7/site-packages/

1 个回答

1

在OSX和Linux系统上,默认的Python安装目录似乎不太喜欢安装额外的Python包。

pip可以像Python本身一样搜索已安装的模块。如果你进行升级,它会先卸载旧版本,然后在你指定的位置安装新版本,默认情况下会安装到site-packages文件夹里。如果你仔细查看pip的输出信息,它会告诉你卸载了什么和安装了什么。

所以,只有当你告诉pip要安装到Extras目录,或者你有一个专门为OSX修改过的pip,才能实现这个功能。

其实,卸载旧版本是件好事,否则你导入的模块版本会依赖于你的搜索路径(sys.path),这样容易出错。

至于它是否应该减少,可以有不同的看法,但这其实是你用pip进行升级时的正常结果。

撰写回答