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

max*_*axm 231 python pip package-managers easy-install

我对python包安装过程感到有点恼火.具体来说,dist-packages目录中安装的软件包与site-packages目录之间的区别是什么?

jte*_*ace 217

dist-packages是一种特定于Debian的约定,它也存在于其衍生产品中,如Ubuntu.当模块从Debian软件包管理器进入此位置时,模块将安装到dist-packages:

/usr/lib/python2.7/dist-packages
Run Code Online (Sandbox Code Playgroud)

由于easy_install并且pip是从包管理器安装的,它们也使用dist-packages,但是它们将包放在这里:

/usr/local/lib/python2.7/dist-packages
Run Code Online (Sandbox Code Playgroud)

来自Debian Python Wiki:

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

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

  • 这准确吗?!我用pip安装它然后去dist-packages.(在Deb Squeeze + Py 2.6上) (20认同)
  • 对我来说也是一样的.使用pip或easy_install安装的软件包都会进入dist-packages. (4认同)
  • 如果你使用带有pip的virtualenv,pip将在*site-packages*目录中安装软件包. (2认同)

use*_*610 13

Debian(和 Ubuntu)引入了自己的约定

# python3 -m site
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)

正如链接的邮件列表中所述,约定是由分发包管理器安装的 python deb 包进入 go into并使用go into/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 约定的要点是将三组软件包分开:

  1. 安装的 python 软件包apt
  2. root 用户安装的软件包/usr/bin/pip3
  3. root用户用自己的安装包/usr/local/bin/pip3


sds*_*sds 5

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
Run Code Online (Sandbox Code Playgroud)

(如果您不使用 gnu 工具,请删除该-v选项)。

  • 我有点困惑你用你的解决方案解决了哪个问题,因为这个问题需要一个解释 (2认同)