我一直在寻找freeze.py
应该在 Python 3.3 Windows 安装中与 Python 3 捆绑在一起的实用程序(尽管已安装distribute
并pip
已安装),但尚未找到。该实用程序可以直接从 Python svn 存储库下载,但我想知道:是否freeze
附带标准的 Windows Python 3 安装?
1 回答
freeze
看起来该工具不附带 Python 的 Windows 二进制安装。这显然是有充分理由的。根据源代码树中的freeze
自述文件:
在 Windows 95 或 NT 下,您必须使用 -p 选项并将其指向 Python 源代码树的顶部。
如果您阅读了整个部分,可以归结为:在 Windows 上,freeze
仅当您从源代码构建 Python 并且生成的树用于冻结时才有效。因此,没有充分的理由为您freeze
提供二进制安装。
同时,我可能一开始就应该问这个,但是……你确定你freeze
一开始就想要吗?
freeze 实用程序非常过时(您可能已经从 README 中猜到需要 VC++ 5.0、Windows 95 或 NT 4.0 等)。它也从未在 Windows 上运行得那么好(正如您从将其描述为实用程序“......为 Unix 系统编译可执行文件”的文档中看到的那样)。而且有很多事情它不能处理,或者处理不好。在这一点上,应该更多地将其视为示例代码而不是有用的工具。
有许多第三方替代品:cx_freeze
、py2exe
、PyInstaller
等。如果您在PyPI 中搜索“冻结”(以及其他看起来合理的术语),您会发现很多这样的替代品。如果您的目标是从您的 Python 脚本中创建一个独立的可执行文件(顺便说一句,freeze
这在 Windows 上永远无法实现),请尝试其中的一些并选择您最喜欢的一个。
如果您的目标不同,那么正确的工具也会有所不同——您最好使用venv
或只是压缩用户站点包目录或创建本地 PyPI 服务器。
在评论中,你说:
我真正想要的是一种将 Python 代码转换为 C 代码的工具。显然,这是不可能的。
这不是不可能的,只是不是freeze
(或其继任者/竞争对手)所做的。Cython几乎将 Python 的严格超集编译为 C 代码,尽管它是使用 Python 运行时对象的 C 代码(除非您使用 C 类型显式静态声明变量和函数)。如果 C++ 是 C 的可接受替代方案,Shed Skin编译 Python 2.6 的受限子集(使用本机 C++ 对象,并使用类型推断,因此您不必静态声明您的类型)。
问题是为什么要将 Python 代码编译为 C。
如果您希望优化一些慢速代码,Cython 非常适合加速小段瓶颈代码。这需要一些努力(决定将什么转移到 Cython,放入什么静态类型声明等),但付出的回报曲线相当稳固。Shed Skin 所付出的努力要少得多——如果它有效,它只会自动加速一切——但这也意味着你一开始就不能编写很多惯用的 Python 代码。但实际上,在查看其中任何一个之前,您应该考虑PyPy,它是 Python 2.7.3(希望很快 3.3)在 JIT 编译解释器中的完整实现,它通常提供类似的加速,几乎没有任何折衷。或者,您可能只需要重写慢代码以利用已经优化的库(numpy
而不是映射到列表,itertools
而不是显式循环,lxml
而不是html.parse
,...)。
如果您正在寻找可以直接与 C 代码交互的 Python 代码,而无需ctypes
担心(或手动构建 Python 绑定),Cython 再次得分。Cython 代码可以有效地本地调用 Python 代码和 C 代码,编译器使这一切都像魔术一样工作。
如果您希望获得可以阅读、维护和改进的 C 代码……那您就太不走运了。而这可能实际上是不可能的。惯用的 Python 代码与惯用的 C 代码是如此不同,以至于很难想象如何将一种代码翻译成另一种。
如果您想知道根本问题是什么:
据我所知,freeze
对事物的布局做了很多假设。拥有任何可以构建 C 扩展模块和嵌入应用程序的 Python 安装应该就足够了,但事实并非如此,因为freeze
在幕后并期望构建以特定方式工作。几乎每个 *nix 平台上的标准二进制安装最终看起来都符合freeze
预期*,但 Windows 上的标准二进制安装看起来完全不同。
使用 Windows 符号链接(至少如果你有 Vista 或更高版本以及具有现代版本 NTFS 的驱动器)来破解所有东西并不是不可能的freeze
(我发现一个博客有人用 2.7.1 做到了这一点...... ),但实际上,我认为不值得尝试。这将是很多工作(尤其是如果您只是在学习这些东西),并且不能保证您不会立即遇到另一个问题。
* 这实际上不是真的。在 Mac 上,Apple 预装的 Python 和 python.org 上的二进制安装程序实际上都为您提供了作为 Mac 框架组织的文件——但它们提供了一堆模拟传统布局的符号链接,这已经足够好了。在大多数 Linux 发行版和许多其他平台上,二进制 python 包根本不包含任何开发文件——但是一旦你安装了一个名为 python-devel 之类的附加二进制包,那么你就得到了正确的布局。无论如何,这些对你来说都不重要,因为如果你想了解 dpkg 依赖项或框架构建,你就不会使用 Windows,对吧?