用于创建可执行存档的工具。
项目描述
这是什么?
pyzzer 是一个简单的工具,可以从Python包和模块源创建可运行的zip存档。它使用Python的标准库 zipfile 模块来构建可运行的.zip文件。使存档可运行有几个要素
它们需要一个 shebang行,指示给POSIX shell用于运行的本地可执行程序。由 pyzzer 创建的存档在其前面有一个shebang行,默认为 #! /usr/bin/env python,但可以通过 pyzzer 的命令行参数来覆盖。
在POSIX系统上,可执行位应在存档的文件系统属性中设置。这是由 pyzzer 为当前用户设置的。
为了让Python能够运行.zip存档,存档需要包含一个名为 __main__.py 的“主”模块。对于 pyzzer 创建的存档,您可以指定一个现有的 __main__.py 文件,指定仅单个源文件(然后将该文件写入存档作为 __main__.py),或者让 pyzzer 从模块:可调用的组合创建一个。除非存档包含一个顶层 __main__.py,否则无法使用 pyzzer 创建存档。
Windows支持
在Windows上,运行存档推荐的方式是安装Python Launcher for Windows,并使用它来运行存档。启动器处理POSIX风格的shebang行,并包含在Python 3.3及以后的版本中,但独立启动器更新更频繁。虽然Python 3.3启动器只能识别.py、.pyc、.pyo和.pyw扩展名,但独立启动器还识别.pyz和.pyzw扩展名,这些扩展名用于可运行的存档。
允许pyzzer提供将适当的本地Windows可执行文件添加到存档之前的能力,该可执行文件能够启动附加到其上的存档。这些启动器适用于32位和64位控制台和Windows应用程序(它们是在独立项目中开发的)。由于将这些可执行文件包含在pyzzer中会使它变大,因此这种支持以单独的下载形式提供(参见获取pyzzer)。
用法
用法信息提供了可用的选项
Usage: pyzzer [options] DIR_OR_FILE_OR_ARCHIVE [DIR_OR_FILE ...] Convert Python source directories and files to runnable zip files. The first argument can be an existing archive, which can be added to with additional sources. Options: -h, --help show this help message and exit -s SHEBANG Specify a shebang line to prepend to the archive, or the path to an interpreter which can be used to determine the shebang line to use. Defaults to "#! /usr/bin/env python" on POSIX and to the value of sys.executable on Windows. -m MODULE:ATTR Specify a callable which is the main entry point. -x REGEX Specify regexes to exclude from the zip (can specify more than once). -o FILENAME Specify the path of the file to write to. If not specified and a source archive is given, it will be used; otherwise the extension defaults to .pyz and the name defaults to the first directory or file specified. -v Provide information about progress. -i Inspect an existing archive. -l LAUNCHER Specify a Windows launcher to use (t32/w32/t64/w64).* -r Recurse package directories.
* 仅在pyzzerw.pyz变体中可用(参见获取pyzzer)。
以下各节将更详细地讨论这些选项。
位置参数
位置参数是一个可选的现有存档,后跟目录和文件的列表。它们被处理如下
如果第一个参数是存档,则除非使用-s来覆盖它,否则将保留其包含的任何shebang。存档的内容将添加到命令行其余部分指定的源。除非可用并使用-l,否则将保留存档/shebang之前的任何文件内容(例如,Windows上的本地可执行启动器)。
如果参数是文件,则将其存档为顶级文件。
如果参数是目录,则“pyzzer”根据它是否包含__init__.py来判断它是否为包。如果是,则将其视为Python包,并将其内容作为目录写入存档。默认情况下,不存档子包,除非指定-r,在这种情况下,将存档所有子包。如果目录不是包,则将其内容存档为顶级文件,并且不会递归到子目录中。
如果添加了已存在于存档中的任何文件,将引发错误。
在添加到存档之前,目录中的文件将与使用-x指定的任何排除模式进行比较。如果匹配,则将其排除。此外,文件.hgignore、.gitignore和.bzrignore永远不会添加,并且目录.hg、.git、.bzr和.svn永远不会递归到,即使指定了-r也是如此。任何未明确排除的文件都假定是包数据并包含在存档中。任何在命令行中指定的文件都假定是需要,并且不会与任何排除模式进行比较。
设置shebang行
您可以使用-s参数指定要使用的shebang行。如果参数值不以#!开头,它将被添加到指定的值之前——因此,您只需指定解释器的路径即可,因为这是所需的全部。
指定主程序
您可以在归档源文件中的某个地方指定一个现有函数,作为Python在运行归档时调用的主函数,方法是在模块:可调用参数中使用带有模块名:main等参数的-m参数,例如foo:main或foo.bar:baz.main。当您这样做时,pyzzer将在这个函数周围包装一个Python源文件,并将其保存为归档中的顶级__main__.py文件。如果您这样做,则不能在您的源中指定__main__.py文件。如果您不指定-m,则必须指定您添加到归档中的源中的顶级__main__.py文件。
从归档中排除文件
您可以通过指定一个或多个正则表达式来排除与它们匹配的文件,这些文件不应包含在归档中。匹配使用search完成,这意味着您需要明确指定^和$来锚定匹配。如果任何模式匹配文件名,则跳过该文件。请注意,模式将原样传递给正则表达式编译器,因此请小心转义模式中的任何特殊字符。
指定输出归档名称
您可以使用-o参数指定输出归档的名称。如果没有指定,并且传递了第一个参数作为归档,则将覆盖相同的归档。如果第一个参数不是归档,则其文件名用作输出归档名称,并且使用.pyz作为扩展名。
获取进度反馈
如果指定了-v选项,则pyzzer将在将文件写入归档时将其相对名称打印到控制台。
检查现有归档
如果指定了-i参数,则第一个位置参数应该是一个现有归档,后续的位置参数将被忽略。将打印现有归档的shebang行和内容。如果检测到原生可执行启动器,将在输出中指示。
递归子包
要递归地添加包中的子包,请指定-r参数。在递归时,假定包下面的所有目录都是子包或数据。
指定Windows启动器
尽管首选通过Windows Python启动器支持Windows,但pyzzerw.pyz归档允许将原生可执行文件添加到归档的前面。要使用它们,请使用-l与t32、w32、t64或w64之一,其中数字后缀表示是否使用32位或64位启动器,而初始字母被解释为t表示文本(即控制台)应用程序,w表示Windows应用程序。您还应该使用带有.exe扩展名的文件名指定-o。
理论上,您应该能够从32位启动器启动32位或64位Python解释器。然而,提供了64位启动器以备不时之需。
请注意,为了达到最佳效果,您指定的任何shebang应与使用的启动器匹配(例如,使用w32或w64的shebang将指定到pythonw.exe的路径)。否则,您可能看到虚假的控制台窗口(使用python.exe运行窗口应用程序)或没有任何输出(使用pythonw.exe运行控制台应用程序)。
这些启动器知道如何处理附加给它们的存档。当存档中的主程序运行时,sys.argv[0]将指定可执行存档的名称(something.exe)。
启动器具有嵌入式清单,这意味着您不会收到UAC提示。
在可运行存档中运行程序
您只需像运行任何正常Python脚本一样运行可运行存档,通过指定存档名称作为命令,并将任何要传递给脚本的参数作为命令的参数。
获取pyzzer
有两种可用的变体。下载pyzzer.pyz不包括对原生Windows启动器的支持,而下载pyzzerw.pyz则包括支持。请注意,这两个都是Windows上的控制台应用程序。
pyzzer是如何构建的
当然,pyzzer被用来构建包含自身的可执行存档。构建pyzzer.pyz的命令行是
python -m pyzzer -o pyzzer.pyz -x "exe|__main__|lau" -m pyzzer:main pyzzer
而构建pyzzerw.pyz的命令行是
python -m pyzzer -o pyzzerw.pyz -x "exe|__main__" -m pyzzer:main pyzzer
这些命令是在pyzzer项目目录(位于pyzzer包目录之上)中运行的。第一个构建不包括包含扩展Windows启动器功能并启用-l选项的pyzzer.launchers模块。
测试pyzzer
要运行pyzzer的测试套件,您需要克隆仓库,然后使用上述命令构建pyzzer.pyz和pyzzerw.pyz。之后,您可以运行test_pyzzer.py脚本。测试通过使用subprocess运行来调用构建的文件,并使用各种命令行选项。
致谢
非常感谢Paul Moore对改进pyzzer的宝贵建议。
限制
目前没有字节编译支持。
不会检查指定的-m值是否实际上存在于源中。
通过存在__init__.py__来识别包,因此不识别新式命名空间包(这些包没有这样的文件)。
不支持替换现有存档中的文件。
欢迎补丁来帮助消除或减轻这些限制。
其他资源
变更日志
0.1.1
发布日期:2013-08-23。
修复了Python 3.x中的TypeError。
当指定-l时,将默认的shebang使用Windows上的sys.executable,而不是POSIX(以及在Python启动器被使用的Windows)上使用的/usr/bin/env python。
如果输出扩展名为.exe且未指定启动器,则假设使用的是t32,除非是在64位Windows上(那里将假设使用的是t64)。
如果只指定了一个源文件,且没有给出-m选项,并且归档文件不包含其他文件,那么该单个文件将使用名称__main__.py写入归档。
增加了测试。
调整了帮助信息。
删除了未使用的代码。
将变更日志移动到README并更新了文档。
0.1.0
发布日期:2013-08-19
初始版本。
pyzzer-0.1.1.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 19a020c4c3b273e5132cb03e6a0a55272bed7a1217f99964a0bf25abc4fe2ef5 |
|
MD5 | dcbf3cab443b26c9bad4765fa7773ef6 |
|
BLAKE2b-256 | 92453672733a72ee12ba440ea2746aae9f8375585caa7674bc8a2ed60ed37e56 |