dist-packages 和 site-packages 有什么区别?
- 2025-02-14 09:50:00
- admin 原创
- 47
问题描述:
我对 python 软件包安装过程有点不满。具体来说,安装在 dist-packages 目录和 site-packages 目录中的软件包有什么区别?
解决方案 1:
dist-packages
是 Debian 特有的约定,也存在于其衍生产品中,例如 Ubuntu。dist-packages
当模块从 Debian 包管理器进入时,它们将被安装到以下位置:
/usr/lib/python2.7/dist-packages
由于easy_install
和pip
是从包管理器安装的,它们也使用dist-packages
,但它们将包放在这里:
/usr/local/lib/python2.7/dist-packages
来自Debian Python Wiki:
dist-packages 而不是 site-packages。从 Debian 软件包安装的第三方 Python 软件将进入 dist-packages,而不是 site-packages。这是为了减少系统 Python 与您可能手动安装的任何源 Python 构建之间的冲突。
这意味着如果您手动从源代码编译并安装 Python 解释器,它将使用该site-packages
目录。这允许您将两个安装分开,特别是因为 Debian 和 Ubuntu 依赖 Python 的系统版本来实现许多系统实用程序。
解决方案 2:
Debian(和 Ubuntu)推出了自己的惯例
# python3 -m site
在 Ubuntu Focal 上
sys.path = [
'/qpid-dispatch',
'/usr/lib/python38.zip',
'/usr/lib/python3.8',
'/usr/lib/python3.8/lib-dynload',
'/usr/local/lib/python3.8/dist-packages',
'/usr/lib/python3/dist-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.8/site-packages' (doesn't exist)
ENABLE_USER_SITE: True
正如链接的邮件列表中所述,惯例是,由分发包管理器安装的 python deb 包进入/usr/lib/python3/dist-packages
,而使用sudo pip3
go into安装的包/usr/local/lib/python3.8/dist-packages
。
如果你编译并安装自己的 Python 解释器,它将默认将自身放置在 中/usr/local
,并将/usr/local/bin/pip3
安装放入 中/usr/local/lib/pythonX.Y/site-packages
。
Debian 惯例的要点是将三组软件包分开:
安装的 python 包
apt
由 root 用户安装的软件包
/usr/bin/pip3
root 用户安装的软件包及其自己的软件包
/usr/local/bin/pip3
解决方案 3:
dist-packages
是 debian 特定的目录,apt
我的朋友们在这里安装他们的东西,这site-packages
是标准pip
目录。
问题是——当同一个包的不同版本存在于不同的目录中时会发生什么?
我解决这个问题的方法是建立dist-packages
一个符号链接到site-packages
:
for d in $(find $WORKON_HOME -type d -name dist-packages); do
pushd $d
cd ..
if test -d dist-packages/__pycache__; then
mv -v dist-packages/__pycache__/* site-packages/__pycache__/
rmdir -v dist-packages/__pycache__
fi
mv -v dist-packages/* site-packages/
rmdir -v dist-packages
ln -sv site-packages dist-packages
popd
done
(如果您不使用 gnu 工具,请删除该-v
选项)。