跳转到主要内容

从Python脚本创建独立可执行文件

项目描述

作者:

Ralf Schmitt <ralf@systemexit.de>

版本:
1.1.3
日期:
2014-01-20
下载:

https://pypi.python.org/pypi/bbfreeze/#downloads

代码:

https://github.com/schmir/bbfreeze

概述

bbfreeze 从Python脚本创建独立可执行文件。它在目的上类似于众所周知的Windows的 py2exe、OS X的 py2appPyInstallercx_Freeze(实际上,早期版本基于cx_Freeze。它还使用modulegraph 包,该包也由py2app使用)。

它具有以下功能

易于安装

bbfreeze 可以使用setuptools的easy_install命令安装。

zip/egg 文件导入跟踪

bbfreeze 跟踪从zip文件中的导入,如果某些模块来自egg文件,则包括整个egg文件。现在使用setuputils的pkg_resources模块的包将正常工作(新功能,0.95.0版)

二进制依赖跟踪

bbfreeze 将跟踪二进制依赖项,并将包括冻结程序所需的DLL和共享库。

多脚本冻结

bbfreeze 可以一次冻结多个脚本。

包含Python解释器

bbfreeze 将创建一个名为“py”的额外可执行文件,这可以像python可执行文件一样使用。

自动路径名重写

跟踪信息中的路径名被替换为相对路径名(即,如果你从 /home/jdoe/pylib/ 导入包 foo.bar,则从 foo.bar 中的函数生成的跟踪信息不会显示你的本地路径 /home/jdoe/pylib/foo/bar.py。相反,它们将显示为 foo/bar.py)

distutils 命令 'bdist_bbfreeze'

一个新的 distutils/setuptools 命令 bdist_bbfreeze 将 bbfreeze 集成到你的 setup.py 中。

bbfreeze 在 Windows 和类 UNIX 操作系统上运行。bbfreeze 已与 python 2.4、2.5、2.6 和 2.7 进行了测试。bbfreeze 不会与 python 3 或更高版本一起工作。bbfreeze 不在 OS X 上运行。

联系方式

bbfreeze 由 brainbot technologies AG 开发。有关问题和建议,请发送到 bbfreeze-users 邮件列表:bbfreeze-users@googlegroups.com

您可以通过发送电子邮件到 bbfreeze-users+subscribe@googlegroups.com 来订阅。

存档可在 http://groups.google.com/group/bbfreeze-users 获取。

您也可以通过电子邮件联系作者:ralf@systemexit.de

来源

Windows Eggs 和源代码可以从 https://pypi.python.org/pypi/bbfreeze/ 下载。

源代码在 github 上的 git 仓库中维护: https://github.com/schmir/bbfreeze

使用

git clone https://github.com/schmir/bbfreeze.git

创建存储库的副本,然后

git pull

在副本中接收最新版本。

安装

您需要安装 setuptools/easy_install。安装应该像输入

easy_install bbfreeze

这样简单。这应该下载 bbfreeze 及其依赖的模块 graph 和 altgraph 并安装它们。

限制

  • 文档有点稀疏

bbfreeze - 命令行工具

bbfreeze 提供了一个名为 bbfreeze 的命令行工具,该工具将命令行中给出的所有 Python 脚本冻结到 dist 目录中,该目录包含每个脚本的可执行文件以及这些可执行文件所需的依赖项。

示例用法

$ cat hello-world.py
#! /usr/bin/env python

import sys
import email

print unicode("hello", "utf8"), unicode("world!", "ascii")

print "sys.path:", sys.path
print "__file__:", __file__
print "__name__:", __name__

print "locals():", locals()

print "sys.argv", sys.argv
print "sys.executable:", sys.executable
$ bbfreeze hello-world.py
WARNING: found encodings in multiple directories. Assuming it's a namespace package. (found in /home/ralf/py27/lib/python2.7/encodings, /usr/lib/python2.7/encodings)
*** applied <function recipe_doctest at 0x1f01aa0>
*** applied <function recipe_time at 0x1f01de8>
*** applied <function recipe_urllib at 0x1f01c08>
RPATH ${ORIGIN}:${ORIGIN}/../lib is fine
$ dist/hello-world
hello world!
sys.path: ['/home/ralf/bbfreeze/tests/dist/library.zip', '/home/ralf/bbfreeze/tests/dist']
__file__: hello-world.py
__name__: __main__
locals(): {'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'hello-world.py', '__package__': None, 'sys': <module 'sys' (built-in)>, 'email': <module 'email' from '/home/ralf/bbfreeze/tests/dist/library.zip/email/__init__.pyc'>, '__name__': '__main__', '__doc__': None}
sys.argv ['/home/ralf/bbfreeze/tests/dist/hello-world']
sys.executable: /home/ralf/bbfreeze/tests/dist/hello-world
$ dist/py
Python 2.7.2 (default, Nov 21 2011, 17:25:27)
[GCC 4.6.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(MyConsole)
>>> import email
>>>

bdist_bbfreeze - distutils 命令

bbfreeze 提供了一个类似于命令行工具的 distutils 命令,但与 distutils 和 setuptools 集成得很好。它收集所有的 'console_scripts' 'gui_scripts' 条目点,生成包装脚本(如 easy_install 会做的那样),并冻结这些脚本。

安装 bbfreeze 后,每个使用 setuptools 的 setup.py 都有一个新的命令 'bdist_bbfreeze'。要显示帮助信息,只需运行

python setup.py bdist_bbfreeze --help

使用示例

# freeze all scripts into ./dist/<egg_name>-<egg_version>/
python setup.py bdist_bbfreeze

# same, but use tagging for "daily build" or "snapshot" releases
python setup.py egg_info --tag-build=dev bdist_bbfreeze

bbfreeze - API

使用 bbfreeze 的首选方式是通过编写使用 bbfreeze API 的简短 Python 脚本。让我们从一个简短的例子开始

from bbfreeze import Freezer
f = Freezer("hello-world-1.0", includes=("_strptime",))
f.addScript("hello-world.py")
f.addScript("hello-version.py")
f()    # starts the freezing process

bbfreeze.Freezer(distdir=”dist”, includes=(), excludes=()) 实例化一个 Freezer 对象。它将在 distdir 目录中创建冻结的可执行文件和依赖项。includes 是要包含的模块的列表或元组,excludes 是要排除的模块的列表或元组。请注意,freezer 在冻结之前会删除 distdir 目录!

bbfreeze.Freezer 对象有以下成员

  • use_compression:标志是否在创建的 zipfile 中使用压缩(默认为 True)。

  • include_py:标志是否创建包含的 Python 解释器 py(默认为 True)

  • addScript(path, gui_only=False):注册一个用于冻结的 Python 脚本。path 必须是 Python 脚本的路径。freezer 将扫描文件以查找依赖项,并在 distdir 中创建具有相同名称的可执行文件。在 Windows 上,gui_only 标志才有意义:如果设置,为该脚本创建的可执行文件将不会打开控制台窗口。

食谱

食谱提供了一种控制冻结过程的方法。如果您需要实现自己的食谱,请查看 bbfreeze/recipes.py。请注意,API 可能会更改。

Linux笔记

用于冻结的系统上的glibc版本通常将是运行二进制文件所需的最低glibc版本。

gtk、gdk、pango、glib共享库不会在冻结过程中被复制。这些库需要一个相当复杂的运行时系统,复制它们可能会引发问题。

Windows笔记

使用python 2.6或2.7创建的二进制文件需要在目标机器上安装Microsoft Visual C++ 2008 Redistributable Package(32位或64位版本)。

变更日志

2014-01-20版本1.1.3

  • 排除Crypt32.dll

  • 添加对SunOS的支持(已在SmartOS上测试)

  • 添加当前python可执行文件路径,即使python未安装也可以冻结(便携式python,buildout)

2013-07-17版本1.1.2

  • 修复python 2.4上的扩展加载器

2013-07-14版本1.1.1

  • 为Windows的可执行文件添加图标。Freezer中添加了SetIcon方法。Winexeutil使用win32api,因此必须安装pywin32才能使用。

  • 无条件将console.exe复制到dist目录,并确保权限可使用

2013-04-10版本1.1.0

  • bbfreeze已拆分为bbfreeze-loader包和纯python bbfreeze模块。这应该允许我更定期地发布。

  • 添加lxml.etree配方

  • 导入时不要污染模块命名空间

  • 不要在EXTENSION_LOADER_SOURCE中污染模块命名空间

  • 确保我们在EXTENSION_LOADER_SOURCE中使用绝对导入

  • 冻结bbfreeze/py.py时不要选择bbfreeze/__main__.py

  • 修复“googlegroup subscribe”地址

  • 修复setuptools不可导入时的bdist_egg过程

  • 修复在buildout下运行时的bdist_egg过程

  • 在“dont_copy_as_egg”中规范化包名称

  • 只有当作为__main__调用时才执行入口点脚本

  • 为egg-info目录使用特定于项目名称

  • 由于它不会工作,不要将PyXML作为egg安装

  • 添加addEntryPoint方法

  • 复制egg-info目录

  • 将bb-freeze重命名为bbfreeze

  • 依赖setuptools/distribute已安装

  • 缩短并简化扩展加载器

  • 在扩展加载器中使用绝对导入以加载stdlib模块

2012-10-23版本1.0.2

  • 使用altgraph 0.9,因为0.10不兼容

2012-09-27版本1.0.1

  • 更新到替代冻结程序的链接

  • 跳过libresolv.so,它是glibc的一部分

  • 为任何看起来像二进制文件的东西调用patchelf

2012-02-08版本1.0.0

  • 更好的测试基础设施

  • 更新文档

  • 移除bbfreeze.macholib

  • 修复在ubuntu 11.10上的构建

  • 在ensureRPath中处理platform==’linux3’的情况

  • 使py配方再次工作。

  • 处理“pip -e”安装的开发egg,这些egg甚至不是setuptools包

2011-04-12版本0.97.3

  • 排除ms-win-api-*和query.dll。

  • 使py解析运行冻结可执行文件所需的选项的最小集合。

  • 在win32上链接/LARGEADDRESSAWARE

  • 确保应用程序加载器的RPATH具有正确的值。如果不行,尝试使用patchelf修复。

  • 如果可用,设置dont_write_bytecode和no_user_site标志。

  • 处理pip安装的命名空间包

2010-10-12版本0.97.2

  • 解决console.exe不可执行的问题。

  • 从setuptools-0.6c11切换到ez_setup.py。

  • 通过将其__gen_path__设置为临时目录来使win32com工作。

2010-08-19版本0.97.1

  • 添加缺失的README.rst文件。

2010-08-17版本0.97.0

  • 使其与最新的altgraph兼容

  • 添加gevent配方

  • 修复在最新ubuntu上的构建

2008-09-18版本0.96.5

  • 添加由Hartmut Goebel贡献的distutils命令“bdist_bbfreeze”

  • 可执行文件现在使用‘strip’命令进行剥离。当使用静态libpython.a库时,这会在文件大小上有所区别。

2008-8-29 发布版本 0.96.4

  • 记录了子包导入中先前缺失的依赖项。这个错误仅当显式删除依赖项时才会出现。

2008-8-18 发布版本 0.96.3

  • 修复了一些被错误识别为开发蛋包的软件包的问题。

2008-8-5 发布版本 0.96.2

  • 添加了来自python trunk的一个稍微修改过的getpath.c。这应该会修复静态链接python的sys.getfilesystemencoding()问题。我们还尝试与静态库链接,以防共享库已经被链接到-Bsymbolic(这使得覆盖必要的符号变得不可能)。这在例如Ubuntu 8.04上会发生。

  • 主程序中的__file__现在有.py后缀。这可以防止警告模块的垃圾输出。

  • 添加了一些配方(主要是打破了某些不必要的依赖项)。

  • 添加了email模块的显式配方。email模块没有作为一个整体添加。

  • 设置脚本现在报告了使用的配置。

  • bbfreeze现在跟踪eggs的依赖关系(即egg的setup.py脚本中指定的依赖关系)。

2008-3-14 发布版本 0.96.1

  • 修复了一个内部函数的bug,该函数确定是否应使用eggs。它始终返回False,因此eggs从未被打包。

2008-3-13 发布版本 0.96.0

  • 一些egg包将site-packages目录作为其位置,这导致整个site-packages目录被复制为某些egg文件。

  • 修复了wxPython的问题。

  • 添加了mercurial的配方。

  • 通过运行setup.py bdist_egg来处理开发蛋包(“python setup.py develop”)。

  • 处理easy install条目脚本。

  • 添加了kinterbasdb的配方(感谢Werner F. Bruhin)。

  • 修复了在链接时默认启用–enable–new-dtags时的LD_RUN_PATH问题(例如在gentoo上)。(感谢Collin Day)

2007-12-6 发布版本 0.95.4

  • 为virtualenv提供解决方案。

  • 在py中显示执行时间。

2007-10-16 发布版本 0.95.3

  • 添加了pythoncom/pywintypes的配方。

  • 让sys.getfilesystemencoding()在非冻结版本中正常工作。

  • 自动路径名重写

  • 在冻结程序中使stdin、stdout和stderr无缓冲。

2007-7-12 发布版本 0.95.2

  • 修复了带有后缀‘module.so’的c模块的问题,例如zlibmodule.so、timemodule.so等(fedora core 7使用该命名方案;感谢Neil Becker的报告)。冻结的可执行程序会退出,并显示zipimport.ZipImportError:无法解压缩数据;zlib不可用”。

2007-7-11 发布版本 0.95.1

  • 在没有伴随的.pyc文件时,编译egg中的.py文件。

  • 在find_all_packages中跳过egg/zip文件(使某些配方工作)。

2007-7-6 发布版本 0.95.0

  • 支持egg文件:bbfreeze扫描zip egg文件,现在将整个egg文件/目录包含在分发中。使用setuptools的pkg_resources模块的程序现在可以正常工作(感谢Eirik Svendsen进行测试)。

2007-6-28 发布版本 0.94.1

  • 修复了设置脚本中的bug,现在确实使用了修补过的modulegraph。

  • 更好的配方处理。

2007-6-22 发布版本 0.94.0

  • 支持相对导入(从modulefinder回滚,bbfreeze现在附带其自己的修补过的modulegraph副本)。

  • 修复了xml/_xmlplus的问题。

  • 添加了cElementTree的配方。

2007-5-31 发布版本 0.93.2

  • 包含tcl/tk运行时文件(真正使Tkinter工作)。

  • 排除gtk、pango和类似软件(即它们必须在目标系统上安装)。

2007-5-14 发布版本 0.93.1

  • 当readline未安装时,使py可执行文件工作。

  • 修复了dll搜索路径问题(使Tkinter工作)。

2007-5-3 发布版本 0.93.0

  • 现在应始终识别对libpython.so的依赖。

  • 支持命名空间包。

  • 对zipfiles/eggs的基本支持(bbfreeze将扫描zipfiles/eggs以查找依赖关系,并在冻结的可执行文件中实现一个假的pkg_resources.require)。请注意,剩余的pkg_resources功能目前不可用。

  • 更新文档。

2007-4-27 发布版本 0.92.0

  • 更好的二进制依赖关系缓存处理。

  • 修复了windows上time模块的配方。

  • 在Windows上使用pefile模块进行二进制依赖跟踪

  • 将gui_only标志添加到addScript方法(该方法在Windows上构建GUI程序,即没有控制台)

  • 在非Windows平台上删除共享库

  • 添加showxref方法

  • py.magic.greenlet的工作配方

2007-4-24 初次发布 0.91.0

授权协议

bbfreeze包含modulegraph的修改版,该模块在MIT授权协议下分发,并由Bob Ippolito版权所有。

bbfreeze包含来自Python分发的getpath.c的修改版,该文件在Python软件基金会授权协议第2版下分发,并由Python软件基金会版权所有。

bbfreeze包括一个名为‘bdist_bbfreeze.py’的模块

版权所有 2008-2012 by Hartmut Goebel <h.goebel@goebel-consult.de>

‘bdist_bbfreeze’模块可以与bbfreeze本身相同的授权协议分发。

其余部分在zlib/libpng授权协议下分发

版权所有 (c) 2007-2012 brainbot technologies AG

本软件按“原样”提供,不提供任何明示或暗示的保证。在任何情况下,作者都不会因使用本软件而承担任何损害赔偿责任。

任何人都可以出于任何目的使用本软件,包括商业应用,并且可以自由修改和重新分发,前提是遵守以下限制

  1. 本软件的来源不得被误导;你不可以声称你编写了原始软件。如果你将本软件用于产品中,产品文档中的致谢将会受到欢迎,但不是必需的。

  2. 修改过的源代码版本必须明确标记为修改版,并且不得将其误认为原始软件。

  3. 本声明不得从任何源代码分发中被删除或修改。

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪一个,请了解更多关于 安装包 的信息。

源代码分发

bbfreeze-1.1.3.zip (65.0 kB 查看散列值)

上传时间 源代码

构建分发

bbfreeze-1.1.3-py27-none-any.whl (50.1 kB 查看散列值)

上传时间 Python 2.7

bbfreeze-1.1.3-py26-none-any.whl (48.6 kB 查看散列值)

上传于 Python 2.6

支持