ChatGPT解决这个技术问题 Extra ChatGPT

dist-packages 和 site-packages 有什么区别?

我对 python 包安装过程有点恼火。具体来说,安装在 dist-packages 目录和 site-packages 目录中的包有什么区别?


u
user7610

dist-packages 是 Debian 特定的约定,也出现在其衍生产品中,例如 Ubuntu。当模块从 Debian 软件包管理器进入此位置时,它们将安装到 dist-packages

/usr/lib/python2.7/dist-packages

由于 easy_installpip 是从包管理器安装的,因此它们也使用 dist-packages,但它们将包放在这里:

/usr/local/lib/python2.7/dist-packages

Debian Python Wiki

dist 包而不是站点包。从 Debian 软件包安装的第三方 Python 软件进入 dist-packages,而不是 site-packages。这是为了减少系统 Python 与您可能手动安装的任何源代码 Python 构建之间的冲突。

这意味着如果您从源代码手动编译和安装 Python 解释器,它将使用 site-packages 目录。这允许您将两个安装分开,特别是因为 Debian 和 Ubuntu 依赖于 Python 的系统版本来提供许多系统实用程序。


这准确吗?!我用 pip 安装,它进入 dist-packages。 (在 Deb Squeeze + Py 2.6 上)
我也一样。使用 pip 或 easy_install 安装的包都进入 dist-packages。
同样在这里,如果我删除所有这些安装会有什么问题吗?
Debian 6.0.10 的相同目录(仍然在 Python 2.6 上)。
如果您将 virtualenv 与 pip 一起使用,pip 将在 site-packages 目录中安装软件包。
s
sds

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 选项)。


我有点困惑你用你的解决方案解决了哪个问题,因为这个问题需要解释
@JürgenK .:对我来说,问题是当不同目录中有不同版本时使用哪个包。
是一个地方的 python 包的解决方案。当您在 Debian 上执行 apt update 并在 dist-packages 中安装新的 python 包时运行它?你有一个 dist-packages cleaner,去申请专利..
还有一个,我有 2 个全局 dist-packages/usr/lib/python3/dist-packages/usr/local/lib/python3.8/dist-packages,我应该做一个吗?
我明白了,这就是为什么在有更多文件夹的情况下使用循环的原因。为什么要使用 if 额外复制 __pycache__?我会一口气复制它,不需要if
u
user7610

Debian(和 Ubuntu)有introduced自己的约定

# 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 安装的包进入 /usr/local/lib/python3.8/dist-packages

如果您编译并安装自己的 Python 解释器,它将默认将自己置于 /usr/local 中,而 /usr/local/bin/pip3 安装进入 /usr/local/lib/pythonX.Y/site-packages

Debian 约定的要点是将三组软件包分开:

apt 安装的 python 包 root 用户使用 /usr/bin/pip3 安装的包 root 用户使用自己的 /usr/local/bin/pip3 安装的包