为什么是 py 而不是 pyc 或 pyo?

Ado*_*obe 8 package-management python

当我安装 python deb 包时,说python-numpy这些文件是普通的 python 文件。我如何告诉包管理器——我实际上宁愿使用 pyc 甚至更好——pyo 文件?

ger*_*ijk 12

你已经拥有它们并且你已经在使用它们

打包好的 Python 应用程序会安装文件.pyc运行的脚本中编译为文件。根据打包指南,这是必需的,以便能够采用您当时正在使用的 Python 安装。请记住,文件非常特定于您的系统(Python 版本和依赖项)。.pyc

因此,所有.pyo.pyc文件都被特别排除在包中,并被 Lintian 标记为错误

编译后的python 源文件不得包含在包中。这些文件应该从包中删除并在安装包时在 postinst 中创建。

有关详细信息,请参阅Debian Python 政策第 2.6 节(模块字节编译)。

严重性:严重,确定性:确定

python-numpy这种安装后字节编译的情况下,由 pycentral 的 debhelper 钩子处理。安装后看起来是这样的:

ls -l /usr/lib/python2.7/dist-packages/numpy
lrwxrwxrwx  1 root root     47 Mar 20  2012 add_newdocs.py -> ../../../../share/pyshared/numpy/add_newdocs.py
-rw-r--r--  1 root root 251912 Aug  6 22:06 add_newdocs.pyc
Run Code Online (Sandbox Code Playgroud)

一些更多的背景信息

这些.pyc/.pyo文件在第一次应用程序启动期间没有按照您的预期在运行时编译的原因如下。

Python 文件安装在系统范围的目录中,可供系统上的所有用户使用。每当用户启动应用程序时,Python 解释器可以读取.py文件,但不能写入目录(例如/usr/lib/python2.7/dist-packages/)。这是所有 Linux 系统中一般安全性的一部分;用户不应写入/usr,只有具有 root 权限才可以。因此,APT 钩子会在安装时为您编译 Python 文件;首先是为了最小化包的大小,其次是能够在你的系统上关于 Python 的某些事情发生变化时重新触发钩子,因为当它们在升级过程中变得不兼容时需要重新编译。

但是,这不会影响在运行时编译的常规用户拥有的 python 文件。

  • @Adobe 什么?不!永远不要让这些系统目录对用户可写。您的包管理人员已经为您编译了它们(根据我在回答中想说的内容)。现在更新以更清楚地了解它。 (4认同)