pyinstaller手册

  

http://www.pyinstaller.org/export/latest/trunk/doc/Manual.html?format=raw

pyinstaller手册

版本:pyinstaller v1.6dev
主页:http://www.pyinstaller.org
作者:乔凡尼的研究和威廉(根据戈登麦克米伦手册)
接触:rasky@develer.com
修订:1823
源地址:headurl美元:https://src.develer.com/svnoss/pyinstaller/trunk/doc/source/manual.rst$
著作权:此文件已被放置在公共领域。

要求

视窗
  • 视窗或更新。
  • 安装Py thon扩展窗口只需要用户的Py thon 2.6 +。
  • 轻掺杂漏-控制台应用程序打印共享库要求每个程序或共享库。
  • objdump控制台应用程序显示对象文件信息。
雪豹操作系统
  • 苹果操作系统×10.4(虎)或更新(豹,豹,狮子)。
太阳系
  • 轻掺杂漏
  • objdump
艾克斯
  • 艾克斯6.1或更新。Py thon程序创建使用pyinstaller在艾克斯6.1应该工作在艾克斯的5.2 / 5.3。pyinstaller不会与静态链接的蟒蛇图书馆中遇到了Py thon 2.2安装到5。”。
  • 轻掺杂漏
  • objdump

安装pyinstaller

  1. 解压缩档案在你的路径选择。为此文件,我们将承担/你/路径/ / pyinstaller /。

    你会使用一些脚本的/你/路径/ / pyinstaller /目录,并将找到他们所需要的一切由自己位置。为了方便,把这些脚本短路径(不要安装在一个嵌套的子目录)。

    请注意:安装程序一个Py thon包,所以不需要去site-packages,或有激素的文件。

  2. 窗口(32 / 64位),下(32 / 64位)和系统(32 / 64位)编译boot-loaders可用。所以安装完整的。

    其他平台,用户应首先尝试建立引导加载器:

    光盘源码蟒。/防火墙配置建设安装

入门

为这一目的,我们将假定文件pyinstaller如安装到/你/路径/ / pyinstaller /。

建立自己的项目

建立一个视窗服务器,请参见组件对象模型服务器支持下面。

在你的/路径/ / pyinstaller /目录,运行:

pyinstaller.py [选择] yourprogram.py蟒

这将创建一个子目录your-program在你的/路径/ / pyinstaller /目录。生成的文件将被放置在子目录your-program /区;那里的文件你有兴趣将放。一个规格文件名为your-program.spec将在创建子目录your-program,太。另外一个减去your-program /建设创建中间建文件保存。

如果您的当前工作目录是/ /路径/ / pyinstaller /,该名录分布规格文件将被创建在当前工作目录。说:中间目录your-program将被跳过。

如果你已经创建了一个规格文件为您的项目在/你/路径/ / pyinstaller /目录运行:

pyinstaller.py [选择] your-program.spec蟒

如果您的当前工作目录是/ /路径/ / pyinstaller /,这个作品类推。

如果一切正常,你的默认设置,这将是你所做的一切。如果不是,见允许的选项什么时候事情出错并请务必阅读介绍规格文件

允许的选项

默认,pyinstaller.py创建一个目录中的主要分布可执行文件,动态库。选择onefile——指定您要pyinstaller建立一个单一的文件,里面的一切。

使用的语法pyinstaller.py以下是:

蟒pyinstaller.py [选择] < scriptname > > < scriptname [……] | < specfile >

允许的选项:

-小时——帮助显示帮助信息并退出
-Ⅴ——版本显示程序版本
——upx-dir =upx_dir
 目录包含了。
configfilename——con fig File =configfilename
 名称产生的con fig File(默认:/家庭/马/。当地/分享/ pyinstaller /配置数据。)
——buildpath =buildpath
 buildpath(默认:specpath /建设/华。target_platform / specname)
-你——no con firm不询问确认
 拆下输出目录(默认:specpath /距离/ specname)没有确认
——日志级别开发=loglevel
 日志级别(默认信息,选择一个调试,信息,警告,错误,关键)

产生什么:

-女onefile——创建一个文件部署
-研发onedir——创建一个目录部署(默认)
-哦目录——=目录
 创建规格文件目录。如果没有指定,和目前目录是安装的根目录,子目录将输出创建的。否则,当前目录使用。
名字——名字名字
 可选名字分配到项目(从该规格文件名生成)。如果省略,名称的(第一)脚本是用。

什么捆绑,何处寻:

目录——路径=目录
 基本路径进口(如用pythonpath)。多个目录允许,分离与路径分隔符(';'下的窗户,':'下),或使用此选项多次。
——additional-hooks-dir =hookspath
 额外的路径搜索钩子。这将进入延长本hookspath,见分析下面。这个选项可以给予几次。
——传统知识包括电视/知识部署
-一个——美国不包括字符编码(默认值:如果包括可用)

如何产生:

-研发——调试使用调试(详细)建立的可执行文件
-——带可执行文件和所有的共享库将贯穿带。注Cyg win的地带,往往使正常使用Win 32动态链接库。
noupx——不要使用了即使使用(作品不同窗口和管理员)

窗口操作系统特定的选项:

——控制台nowindowed——
 使用控制台系统可执行文件(默认)
-瓦特——窗口noconsole——
 使用一个窗口系统的可执行文件,在窗口没有打开的控制台程序的时候了。这个选项是强制性的,当创建程序包。雪豹操作系统
-我file.ico,-我的文件。文件,身份证,我file.icns,——file.ico图标=,=——图标文件。文件,身份证,——= file.icns图标
如果文件是一个图标文件的图标,添加。到最后可执行文件。否则,语法文件。文件,身份证'提取与指定的身份file.exe图标并把它添加到最后的可执行文件。如果文件是。图标,图标添加到最后。程序包苹果(苹果尚未实施)

窗口的具体方案:

——version-file =文件
 添加一个资源文件,该文件的版本
-米文件-米可扩展标记语言——表现=文件——表现=可扩展标记语言
 清单文件或添加的文件
-文件类型[,[名字],[,] ]的语言,文件类型——资源= [,[名字],[,] ]语言
添加/更新资源的特定类型,名称和从语言到最终的可执行文件。文件是一个数据文件或文件/文件。数据文件,至少需要指定类型和名称,默认语言0或可能被指定为通配符*更新所有资源的类型和名称。为执行/动态链接库文件,资源文件将添加/更新在最终的可执行文件如果类型,名称和语言略或指定的通配符*多资源。是允许的,使用这个选项多次。

建立和优化(如-哦),参见建立优化

一个规范文件为您的项目

该规范文件是描述你想要什么pyinstaller做你的程序。通过deafult,pyinstaller.py一个规范文件自动生成。简单的项目,所产生的规范文件将可能是足够的。

对于更复杂的项目,它应被视为一个模板。规格文件实际上Py thon代码,并修改它应该是轻松。参见规格文件为细节。

在根目录pyinstaller,有一个简单的向导创建简单规格文件,涵盖了所有的基本用法:

Py thon模块/ makespec.py——onefile yourprogram.py [ ]

阐述makespec.py,这是支持的命令行:

Py thon模块/ makespec.py [选择] < scriptname > > < scriptname [……]

脚本makespec.py有些股票期权pyinstaller.py。允许的选项看:

Py thon模块/ makespec.py——帮助

视窗服务器支持

为支持执行:

蟒makecomserver.py [选项]脚本…

这将产生一个新的脚本drivescript.py和规范文件的脚本。

这些选项允许:

——调试使用详细的版本的可执行文件。
——详细注册服务器(县)与安静的旗帜下。
——美国不包括编码(这是通过对makespec)。
——<目录>生成驱动脚本和规范文件的目录。

现在建立自己的项目在生成的规格文件。

如果你有win32dbg包安装,你可以使用它的产生服务器。在驱动器脚本,集调试= 1在登记线。

警告:该制程服务器支持将不工作时,客户端已加载过程蟒。这将是相当棘手非9200钩到一个已经运行的巨蟒,但障碍是那蟒蛇指针不会让我们找到了,我要解释实例钩。(如果这对你很重要,你可能会尝试使用公寓的线程,这似乎是最可能得到这个工作)。到使用“冻结”服务器从Py thon的过程中,你必须加载它作为一文件:

= win32com。客户端调度(ID,clsctx = pythoncom clsctx_local_server。)

makecomserver还假定您的顶级代码(注册等)是“正常”。如果不是的话,你会有编辑生成的脚本。

建立优化

有2个方面:收集运行优化表。的,并设置py_optimizeflag。安装程序将聚集表。“如果是运行优化:

巨蟒- pyinstaller.py啊…

py_optimizeflag将设置如果您使用(哦,',' ','option ')在一个本建筑的文件

可执行文件(中碎=,a.scripts + [(‘',' ','option ')],…

参见规格文件详情。

说明,使用了

在窗户和下了,可以给真正令人吃惊的压缩-天拟合点有用的软盘上没有永远的离开了!安装程序被测试了很多版本没有问题了。刚刚得到它安装在您的路径,然后重新运行配置。

为窗口,有一个问题之间的兼容性和可执行文件了由微软视觉工作室。2003(或同等自由工具箱可以下载)。这是特别令人担忧的用户Py thon 2.4 +,大多数扩展(和Py thon本身)编制,编译器。这一问题已被固定在后来的测试版本的了,所以你将需要至少了1.92测试版。pyinstaller.py将检查这个给你和抱怨,如果你有一个旧版本的了,你是使用Py thon 2.4。

上的更多一点的讨论,以。第一,是唯一有用的可执行文件,没有共享库。安装程序的帐户,但得到的全部你可能会受益,重建巨蟒与更多的东西,静态链接。

更重要的是,当运行发现其系统argv [ 0 ]。不包含路径,它将使用程序/控制/文件发现自己(如果可以)。发生这种情况,为例如,执行时由阿帕奇。如果它已经upx-ed,这个符号链接点的临时文件创建的短了pyinstaller将失败(请看到了文件的更多信息)。所以现在,至少,你不能用了对电脑的执行由阿帕奇。否则,你可以无视警告的了文件,因为pyinstaller打开可执行安装程序创建的,不是临时upx-created可执行文件。

如何one-file模式

一个onefile——作品由包装所有共享库/ DLL的档案连接到程序可执行(或下的可执行文件,在低频配置)。启动时,它发现它需要提取这些文件才能运行“真实的”。这是因为定位和加载共享库或联系,是系统级行动,没有用户。与pyinstaller v1.6dev它总是使用一个临时目录(_mei xxxxx,在哪儿xxxxx是一个随机数在避免冲突)用户的临时目录。然后执行它本身又设置的东西了,所以该系统将能够负载共享库/ DLL。当执行完整的,它递归删除整个目录的创建。

临时目录的出口程序的环境_meipass系统。。这可以用来在你手动修改规格文件告诉pyinstaller添加其他文件(例如:数据文件)在可执行文件(参见访问数据文件)。

这有一定数量的影响:

  • 你可以运行多个副本-他们不会碰撞。
  • 运行多个副本将相当昂贵的系统(是什么共享)。
  • 使用任务管理器窗口,杀了父进程将离开后面的目录。
  • *尼克斯,杀死- 9(或事故)将离开后面的目录。
  • 否则,两个平台,将递归删除目录。
  • 所以任何文件,您可以创建于_meipass系统。将被删除。
  • 可执行文件可以在一个受保护的或只读目录。

*无用户注释:注意,如果可执行文件一个文件,一个确定的黑客可能(给予足够的尝试引入一个恶意的)极为相像的一个共同的图书馆在洞之间时库中提取到临时目录中,当它被加载由execvp要过程。也许你不应该做的文件程序使用onefile——事实上,我们不推荐使用onefile——在setuid程序。

文件和setuptools蛋。

setuptools是一个distutils扩展提供了许多好处,包括能力分配的扩展鸡蛋。连同漂亮的easy_install(工具的自动定位,下载和安装Py thon扩展),鸡蛋变得越来越一个普遍的方式分发Py thon扩展。

鸡蛋可以是文件或目录。一个目录基本上是标准的Py thon包,与一些额外的元数据可以用来先进的setuptools特征的切入点。一个文件仅仅是一个压缩文件,和它的作品作为一个整体以及因为Py thon 2.3 +能透明进口模块存储在压缩文件。

pyinstaller支持鸡蛋在一个良好的水平。事实上:

  • 它能够跟随相依鸡蛋(这两个文件和目录)。所以如果你的程序进口包装发运格式,这包需要额外的图书馆,pyinstaller将正确地包括一切在生成的可执行文件。
  • egg-files完全支持。让所有的作品(切入点,pkg_resource图书馆,等。),pyinstaller可以复制egg-files分布的目录(在one-dir模式)或是内包装生成的可执行文件,在启动时打开到临时目录(参见如何one-file模式)。
  • egg-directories部分支持。事实上,pyinstaller在建时间把他们当作经常包。这意味着,所有先进的功能要求元数据将不工作。

改进的支持鸡蛋计划在将来发布pyinstaller

multipackage功能

与pyinstaller你可以创建一个集合包避免图书馆复制。你可以用函数之间建立联系合并在你的规格文件。

例如,你可能希望部署您的应用程序更新和配置,双方共享库的主要应用。在这种情况下你可以使用合并功能的为了创造主,大,包装,所有的库和依赖内,两只小包装下的第一人。在这种情况下,你会通过一个三元组表到合并:第一种的主要应用,并为更新和复印机;结果将是三包目录。

注意,所有依赖文件将被创建在第一包,参考了其他可执行文件。因为这个原因,所有软件包与这个方式必须放在同一目录,改变目录结构合并后会导致失败的可执行文件。

有multipackage例子中的buildtests / multipackage目录。

pyinstaller公用事业

archiveviewer

Py thon模块/ archiveviewer.py < archivefile >

archiveviewer让你检查的内容,任何档案建设pyinstaller或可执行文件(中碎,封装或程序)。调用它的目标为第一个参数(它已经成立,作为一个发送到它显示在上下文菜单探索者)。存档可以导航使用这些命令:

0<>
开放嵌入式档案<>(会提示如果省略)。
上一级(回到查看嵌入档案)。
×<>
提取纳米(会提示如果省略)。输入输出文件名。如果不给出,提取到标准输出。
辞职。

此外archiveviewer具有一些简单的控制台命令:

-小时——帮助显示帮助。
-我——日志快速内容日志。
-乙——简介打印一个Py thon评估的内容列表的文件名。
-研发——递归
 与-或-乙,运用递归的行为。

bindepend

Py thon模块/ bindepend.py < executable_or_dynamic_library >

bindepend将分析可执行文件传递给它,写作者所有其二进制相关性。这是很方便的找到需要的DLL一个可执行文件或动态链接库。这个模块是用pyinstaller本身按照依赖链二进制扩展和确保所有它们包含在最终包装。

grabversion(窗口)

Py thon模块/ grabversion.py < executable_with_version_resource >

grabversion输出文本,可以eval'ed的versioninfo.py重现版本资源。调用它的完整路径名的可执行文件(一个版本资源)作为第一个参数。如果您剪切和粘贴(或重定向到一个文件),然后你可以编辑的版本信息。编辑的文本文件可以用在版本= myversion.txt选择的任何可执行文件在一个pyinstaller规范文件。

这是这样,因为版本资源是相当奇怪的野兽,充分了解他们可能是不可能的。一些元素可选的,其他人的需要,但你可以用无限的时间了解,因为它没有很好的记载。当你查看版本在属性对话框选项卡,有没有简单的关系数据如何显示和结构本身的资源。所以简单的事情就是找到一个可执行文件,显示类你想要的信息,抓住它的资源和编辑。当然容易版本资源向导在VisualC + +。

分析依赖

你可以以交互方式追查相依,包括参照采用mf.py,记录在一节mf.py:一个modulefinder置换

规格文件

景区简介

当你运行工具/ makespec.py(记录在部分一个规范文件为您的项目),它生成一个规格文件给你。事实上,你能想到的工具/ makespec.py就像一个向导,您可以生成一个标准规格文件用于大多数标准用法。但高级用户可以学会编辑规格文件完全定制pyinstaller行为他们的需求,给超出标准设置提供的向导。

规格文件中的语法。他们的评价pyinstaller.py。一个简单的规格文件可能看起来像这样:

分析(= [ 'myscript坪”]。)中碎、中碎(a.pure)可执行文件(=中碎,a.scripts,a.binaries,名“是的。”)

这将创建一个文件部署与所有的二进制文件(扩展模块和他们依赖)装在可执行文件。

一个简单的单一目录部署可能看起来像这样:

分析(= [ 'myscript坪”]。)中碎、中碎(a.pure)可执行文件(= a.scripts,中碎,名“My App文件。”,exclude_binaries = 1)距离=收集(,a.binaries,名“区”)

请注意,无论这些例子是现实。如果你想黑客开始规格文件,使用工具/ makespec.py创建一个基本的specfile,和调整(如有必要)从那里。

所有类,你看到的是子类建设目标。。目标行为像一个规则生成文件。它知道足够的缓存最后输入输出。如果输入并没有改变,它可以承担其输出不会变化的重新计算。所以一个规格文件的行为很像的,只有重建尽需要重建。这意味着,例如,如果你换一个文件调试= 1调试= 0,重建将是近瞬时的。

高层次的看法是,分析需要一个脚本列表作为输入,并产生三“输出”,在属性名脚本二进制文件。一个中碎(一中碎。档案)是建立从模块纯。本文件是建立从中碎,脚本和,在一个案件单文件部署,二进制文件。在single-directory部署,一目录建立包含一个细长的可执行文件和二进制文件。

目录类(目录)

在你可以做一个规范文件,您需要了解的总有机碳(目录)类。

一个总有机碳似乎是一个元组的列表形式(名称,路径,Type Code)。事实上,它是一个偏序集,不是一个列表。目录包含任何副本,其中独特性是基于名字。此外,在这方面的限制,一个目录维持秩序。

除了正常的列表的方法和操作,目录支持差异和路口(注意,加重或延长真是等价的联盟)。此外,该行动可以采取的一个元组的列表上的权利手的方。这使得不含模块很容易。对于一个纯Py thon模块:

中碎、中碎(a.pure - [('badmodule ',' ',' ')])

或一个扩展模块在single-directory部署:

距离=收集(……,a.binaries - [('badmodule ',' ',' ')],……)

或为一个单一的部署:

可执行文件(=……,a.binaries - [('badmodule ',' ',' ')],……)

添加文件到一个目录,你需要知道的typecodes(或步骤使用目录不会知道做什么,与进入)。

Type Code描述名字路径
“扩展”一个扩展模块。蟒蛇内部名字。在建立完整的路径名。
pysource ' '一个脚本。蟒蛇内部名字。在建立完整的路径名。
pymodule ' '一个纯Py thon模块(包括__init__模块)。蟒蛇内部名字。在建立完整的路径名。
“中碎”一。中碎档案(archive_rt zlibarchive。)。运行时的名字。在建立完整的路径名。
'包'一个封装档案(carchive4 carchive。)。运行时的名字。在建立完整的路径名。
二进制的共享库。运行时的名字。在建立完整的路径名。
'数据'任意文件。运行时的名字。在建立完整的路径名。
“选项”一个运行时的运行时选项(冷冻成可执行文件)。选择。闲置的。

你可以迫使包括任何文件在同样的方式你不:

收集收集(a.binaries + =[('readme ',' /我的/项目/自述','数据')],……)

甚至:

收集收集(a.binaries =,[('readme ',' /我的/项目/自述','数据')],……)

(也就是说,你可以使用一个元组的列表中的一个地方总有机碳在大多数情况下)。

没有太多的理由使用这种技术pysource,因为分析需要一个脚本列表作为输入。为pymodules扩展,钩机制,这里讨论的是因为你不会记得你接下来的时间得到它的工作。

这项技术是最有用的数据文件(见下一班道路建设总有机碳从一个目录树),以及运行时选项。选项运行可执行文件理解:

选项描述示例注释
五世详细的进口('v ',' ',' ')同为蟒-Ⅴ…
缓冲工作室('u ',' ',' ')巨蟒-你一样…
瓦规格警告选项(p忽略',' ',' ')Py thon 2.1 +只。
使用site.py(',' ',' ')相反的蟒蛇的国旗。请注意,site.py必须在可执行文件的目录用来。

高级用户应该注意,使用一套差异和路口,它成为可能的因素共同的模块,并部署项目包含多个可执行文件的最小冗余。你需要一些顶级代码在每一个可执行文件上常见的中碎

目标子

分析

分析(脚本,pathex =不,不排除hookspath =,=没有)
脚本
一个脚本列表指定为文件名。
pathex
一个可选的路径列表进行搜索之前sys.path。
hookspath
一个可选的额外的路径搜索钩子(hook-modules)。请参考 上市进口隐患详情。
不包括
一个可选的模块或包的名字(名字的蟒蛇,没有路径名字),将被忽略(好像他们没有发现)。

分析有五个输出,所有作为属性访问的分析

脚本
你给的脚本分析作为输入,任何运行时的钩子脚本预置。
纯Py thon模块。
二进制文件
该扩展模块和他们的依赖性。次要相依过滤。窗户,一长串的毫秒DLL排除。在操作系统,任何一个共享库 /库/使用/库排除。
数据
数据依赖。这些文件被发现被需要的模块。它们可以是:插件,字体文件,等等。
zipfiles
zipfiles(通常的依赖 egg-files)。

中碎

中碎(目录,名字=不,水平= 9)
总有机碳
一个 总有机碳通常,一个 analysis.pure
名字
一个文件名为 中碎。。通常不需要,因为生成的名字会做的很好。
水平的
时使用的压缩级别。如果0时,该模块是不需要的。

封装

通常,您不需要创建自己的件数,为文件会做这个你。这是一个方法,包括只读数据在一个单一的文件部署,不过。一个单文档部署支持将使用这种技术包括传统知识。

封装(目录,名字=不,数=不,exclude_binaries = 0)
总有机碳
一个 总有机碳
名字
一个文件名为 封装(可选)。
贫穷的
字典指定压缩Type Code。比如说呢。 中碎是左压缩,以便它可以访问内 封装。默认的采用合理的价值。如果时不可用,没有使用压缩。
exclude_binaries
如果1, 扩展binarys会离开的 封装,和转发至容器(通常是一个 收集)。

文件

文件(* * *律参数,)
参数
一个或多个参数可以是 目标
知识工作系统

可能的关键字参数:

控制台
1上下。窗户,规范是否使用控制台可执行文件,可执行文件或窗口系统。
调试
设置1给你的进度消息从可执行文件(一 控制台= 0,将这些恼人的messageboxes)。
名字
文件名的可执行文件。
exclude_binaries
转发到 封装文件建设。
图标
窗口新台币的家庭。 图标= 'myicon。”’使用一个图标文件,或 图标,0 = 'notepad。”抓住一个图标资源。
版本
窗口新台币的家庭。 版本= 'myversion的。”。使用 grabversion.py到偷一个版本资源从一个可执行文件,然后编辑输出到创建您自己的。(语法版本资源是如此的神秘,我不尝试写一个从零开始。)
append_pkg
如果 真的,然后附加档案的文件包。如果 ,地方档案的封装在一个单独的文件 exename.pkg。默认值是取自国旗 config.dat依赖的是否make.py了 争论当建立了装载机。默认是 真的在视窗。在低频的平台连接到任意的数据一个可执行文件的不工作, append_pkg必须设置为

动态链接库

窗户,这提供支持做中间服务器。它不是广义。然而,embedders可以遵循同样的模式建立一个特殊的目的动态链接库因此Py thon支持他们的应用程序隐藏。你将需要自己写的动态链接库,但由于艾伦绿色重构代码和制作,管理的任务。

收集

收集(* * *律参数,)
参数
一个或多个参数可以是 目标
知识工作系统

可能的关键字参数:

名字
目录的名字被建立。

树(根,前缀= =不不,不)
树的根(的系统)。
前缀
可选的前缀的名称在目标系统。
不包括

名称列表中排除。形式是允许的:

名字
文件与此名称将被排除(不包括路径)。
*分机。
任何文件与给定的扩展将被排除。

是一个总有机碳,你也可以用排除上述技术在这一节

合并

与合并功能,我们可以创建一个组相互依存的包。

合并(*参数)
*参数
这是一个元组的列表。第一个元素的元组是一个分析对象,二是脚本的名称没有延伸和第三个是最后的名字。

合并函数滤波器分析避免重复库和模块。结果生成的包将被连接。此外,为了确保一致性依赖,它取代了临时名称与实际的名字。合并后使用的分析阶段的前文件收集

这里是规范文件例子合并功能的:

# #在包的文件夹将建立快捷方式,并将驻留targetdir =操作系统路径。。abspath(操作系统。道路。加入(‘。’,‘。’,’客户,'programs '))# #应用程序名称appnames = [为在操作系统。listdir(getcwd()操作系统。)如果操作系统路径isdir(四)。。和[ 0 ]!=”。”和[ 0 : 6 ]!= 'common '与研发!= '建立'与研发!= ' ]# #建立合并参数(分析对象,脚本基地名称,最后文件路径)#开始与虚拟包分析= [(分析([操作系统。道路。加入(homepath,'support ',' _mountzlib坪。”),操作系统。道路。加入(homepath,'support ',' useunicode坪。”),操作系统。道路。加入('dummy ','dummy坪”。)]),',操作系统。道路。加入('dummy ',' 'dummy。))]#注:这个假设的主要脚本在每个appname.pyw在应用程式名称的文件夹分析+ = [(分析([操作系统。道路。加入(homepath,'support ',' _mountzlib坪。”),操作系统。道路。加入(homepath,'support ',' useunicode坪。”),操作系统。道路。加入(应用程式名称,应用程式名称+ '。pyw ')]),应用程式名称,操作系统。道路。加入(应用程式名称,应用程式名称+ '。'))为应用程式名称在appnames ]# #合并所有的依赖合并(分析)# #建立每个应用程序肛门,名称,exename分析:中碎、中碎(肛门。纯)可执行文件(中碎=,anal.scripts,anal.dependencies,exclude_binaries = 1,名字= exename,版本= 'falconversion的。”,调试=假,带=假,了=真,控制台=假)分布和收集(=,anal.binaries,anal.zipfiles,anal.datas,带=假,# # #了=如果(:= = ')其他假,了=假,名字=操作系统。道路。加入(targetdir,:))

当事情出错

食谱

一些常见的问题有一些代码例子我们食谱页面。

发现出了什么差错

buildtime警告

当一个分析步骤,它产生一个警告文件(命名为warnproject.txt)在规范文件的目录。一般来说,大多数这些警告是无害的。比如说呢。os.py(这是跨平台)的作品,搞清楚什么平台是,然后输入(和重新绑定的名字)适当的平台模块。因此分析os.py将生成的警告喜欢的:

警告:没有模块命名分区(有条件的进口操作系统)警告:没有模块名为行政长官(有条件的操作系统)警告:没有模块(有条件的进口的嵌入式操作系统)

需要注意的是,分析检测的进口是在一个条件块(要)。分析还发现如果进口内函数或类,(延迟)或在最高水平。一个顶级的,无条件的导入失败真是个错误。至少有一个合理的机会有条件的和/或延迟进口将在运行时处理的优雅。

忽略警告也可能产生的类或函数的声明中一个包(一__init__坪。模块),并导入指定package.name。在这种情况下,分析不能告诉如果名字应该是指一个模块包。

警告也时产生的__import__执行的评价声明遇到。本__import__警告应该几乎肯定是调查。两执行的评价可用于实施进口黑客,但通常使用更良性的。

在这里发现的任何问题可以由挂钩模块的分析。参见上市进口隐患下面怎么做。

获得调试信息

调试信息pyinstaller可以启用通过日志级别开发——国旗的pyinstaller.py脚本:

pyinstaller.py——scriptname > < =调试日志级别开发

设置调试= 1上一个文件将导致执行扑灭进展信息(对控制台应用程序,这些作者;窗口应用程序,这些显示messageboxes)。这可能是有用的,如果你做复杂的包装,或你的应用程序无法启动,或只是学习如何运行工程。

得到的冗长的进口

你也可以通过-Ⅴ(详细进口)标志的嵌入蟒蛇。这可以是非常有用的。我通常尝试甚至显然工作程序,只是确保我总是让我的副本的模块和没有进出口泄露给安装蟒蛇。

你将这个(像其他运行时选项)的电话总有机碳进入本文件。最简单的方法就是改变文件从:

执行(……,anal.scripts,等…)

到:

执行(……,anal.scripts + [('v ',' ',' ')],……)

这些信息都会去标准输出,所以你不会看到他们在窗控制台= 0

帮助pyinstaller找到模块

扩展路径

在分析阶段无法找到所需的模块,它可能是代码操纵sys.path。最容易做的事情就是在这种情况告诉分析关于新目录的精氨酸的构造函数:

肛门=分析([ 'somedir / myscript坪”],[ 'path / / thisdir ','路径/ / thatdir ' ])

在这种情况下,该分析有一个搜索路径:

[ 'somedir ','路径/ / thisdir ','路径/ / thatdir ] + sys.path

你可以做同样的运行时工具/ makespec.pypyinstaller.py

工具/ makespec.py——路径=路径/ / / / thatdir thisdir;路径…pyinstaller.py——路径=路径/ / / / thatdir thisdir;路径…

(*尼克斯,使用作为路径分隔)。

上市进口隐患

隐藏的进口是相当常见的。这些可能发生的代码使用__import__(或者,也许执行的评价),在这种情况下你会看到一个警告本warnproject.txt文件。他们还可以发生在一个扩展模块使用Py thon指针做进口,在这种情况下不能检测分析什么。

你可以验证隐藏进口的问题通过使用Py thon的冗长的进口国旗。如果进口消息说“模块,但没有发现”warnproject.txt文件没有“无模块名叫……”信息相同的模块,那么问题是一个隐藏的进口。

进口隐患处理挂钩模块(一个做隐藏在进口)分析时间。像下面这样:

  1. 创建一个文件名为hook-module.py(在哪里模块是完整的Py thon的名称,如,hook-xml.dom.py)和地点在某处。记得的地方你的私人钩目录

  2. 在规范文件,通过。你的私人钩目录hookspath参数分析所以将搜索。示例:

    分析(= [ 'myscript。芘],hookspath =“/我的/私人/钩子)

在大多数情况下钩子模块将只有一个线:

hiddenimports = [ 'module1 ',' module2 ' ]

什么时候分析找到这个文件,它将完全一样虽然明确进口模块模块module2

如果你成功地钩公开分布式模块这样,请寄给我们钩所以我们可以使它提供给他人。

你可能想看看现有的钩在pyinstaller.hooks下包pyinstaller的根目录。全部细节的分析时挂钩的机制是在部分的。

扩展包__path__

可以包扩展搜索路径用于查找模块和子通过__path__机制。通常,一个包__path__有只有一个条目的目录__init__坪。被发现。但__init__坪。免费延长__path__包括其他目录。为例如,该win32com.shell.shell实际上,决心模块win32com / win32comext壳/ shell.pyd。这是因为win32com / __init__坪。追加/ win32comext__path__

因为__init__坪。没有实际运行的分析过程中,我们使用相同的挂钩的机制我们使用隐藏的进口。静态列表名称不会做,然而,由于新条目__path__可能需要计算。所以hook-module.py应定义一个方法钩(国防部)。国防部的说法是实例中频模块。具有(或多或少)相同的属性作为一个真正的组件对象。钩子函数应该返回一个中频模块。实例——也许一个全新的人,但更可能是相同的一个用来作为一个参数,但突变。参见mf.py:一个modulefinder置换细节,和pyinstaller /钩/ hook-win32com.py为例。

请注意,操纵__path__钩以这种方式适用于分析,只有分析。那是,在运行时win32com.shell是一样的方式win32com.anythingelse,和win32com __path__。什么也不知道/ win32comext

曾经有一段时间,那是不够的。

改变运行时行为

更奇怪的情况下可以使运行时钩。这些都是小脚本操作的环境,在主要的脚本运行,有效地提供额外的顶级代码脚本。

经过分析,模块列表检查匹配支持/ rthooks.dat,这是的字符串表示Py thon字典。关键是模块的名字,和值是一个列表hook-script路径的。

所以把入口:

“somemodule”:[ 'path / / somescript坪”],

进入支持/ rthooks.dat几乎是同一事物这样做:

肛门=分析([ 'path / / somescript坪','。' ]芘主要,…

除了用钩,路径/ / somescript.py不会分析,(这不是一个特征——我们只是还没有找到一个合适的递归到理智的方式我的持久方案)。

钩这样做,而他们需要小心他们的进口,是免费做几乎任何事情。一个提供钩集的东西,win32com可以在运行时生成模块(盘),并生成模块可以在win32com包。

适应被“冻结”

在最先进的应用,有必要找出(在运行时)你是否正在运行的“活”或“冻结”。例如,你可能有一个配置文件(“活”)你找到基于模块__file__属性。不工作的代码一旦被打包。你会要找它的基础上sys.executable相反的。

这个引导程序集系统冷冻= 1。(和,中间服务器,其嵌入文件集系统冷冻= 'dll”。)。

真正的高级用户,您可以访问iu.importmanagersys.importmanager。参见iu.py你可以如何使用这个事实。

访问数据文件

onedir——分布,这是很容易的:通过一个列表的数据文件(在总有机碳格式)的收集,他们将出现在分布目录树。这个名字的(名称,路径,数据)元组可以是相对路径名。然后,在运行时,您可以使用代码这样找到的文件:

操作系统(操作系统的路径加入。。。路径。目录名(系统。可执行文件),relativename))

onefile——分布,数据文件捆绑在可执行文件然后提取在运行时的工作目录的代码(这是还能够重建目录树)。工作目录是最好的发现_meipass系统。。所以,你可以通过访问这些文件:

操作系统路径加入(系统。。。_meipass,relativename))

其他图书

自解压缩的可执行文件

精灵的可执行文件格式(窗口,和其他一些)允许任意数据连接到年底的可执行文件,而不会干扰功能。出于这个原因,一个carchive的内容表结束时的档案。可执行文件可以打开自己作为一个二进制文件名,寻求结束,'开放'carchive(参见图3)。

其他平台上的可执行文件,档案是分开的,但档案名executable.pkg,并预计将在同一个目录。另外,这个过程是相同的。

一个通过执行

在一个单一的目录部署(onedir——,这是默认值),所有的二进制文件已经在文件系统。在这种情况下,该嵌入应用程序:

  • 打开的档案
  • 开始蟒(窗口,这是动态加载一个嵌入应用程序二进制可用于任何Py thon版本)
  • 所有进口的模块是在最高一级的档案(主要,努力进口钩)
  • 坐骑zlibarchive()在外部档案
  • 运行脚本,在最高一级的档案
  • 定型蟒

通过执行

有几点需要的情况,通过:

  • 一个onefile——部署(窗口,文件不能清洗后来因为蟒蛇不叫freelibrary其他;平台,蟒不会找到他们,如果他们在同一过程,使用它们)
  • ld_library_path需要设置的二进制文件(没有找到扩展模块,而模块扩展联系)。

首次通过:

  • 打开的档案
  • 提取所有的二进制文件档案(在pyinstaller v1.6dev,这始终是一个临时目录)。
  • 设置一个神奇的环境变量
  • ld_library_path(Windows)
  • 执行过程本身作为一个孩子(让孩子用他的标准输入,标准输出和标准错误)
  • 等孩子退出(*尼克斯,孩子却代替父母)
  • 清理提取二进制文件(以*无,这是由儿童)

子进程的执行中一个通过执行以上(魔术环境变量是什么告诉它,这是过去两年)。

se_exeimage图3 -自解压可执行文件

还有,当然,相当多的分歧,窗户和操作系统的版本。一个是主要的,因为所有的Py thon窗在pythonxx.dll,和动态加载是如此简单,一二进制可以使用任何的Py thon版本。有很多共同点,虽然,和代码中可以找到源/普通/发射的。

该系统的建立过程(你需要运行一次任何版本蟒蛇)使用的配置信息,在您的安装(如果你安装在转,你需要python-development转)。它也覆盖getpath丙。因为我们不想找文件系统的建立sys.path

在这两种情况下,当一个pyinstaller下载可用于任何蟒版本,你需要有单独的设备为每个Py thon版本。

pyinstaller档案

档案馆介绍

你知道什么是:一个档案焦油。文件,一个罐。文件,一个邮政编码。文件。2种档案是用在这里。一个是等价的在爪哇罐。文件-它允许Py thon模块存储有效,(有一些进口钩)直接进口。这是一个zlibarchive。其他(一carchive)是相当于一个邮政编码。文件一般整理方法(和可选压缩)任意数据块。它得名于事实它可以很容易被操纵的,以及从蟒。两这些来自一个共同的基类,使它很容易创造新的类型的档案。

zlibarchive

一个zlibarchive包含压缩热解。(或表。)文件。表的内容是编组词典,用钥匙(之给出了一个模块的名称进口声明)与寻找的位置和长度。因为它是所有编组蟒,zlibarchives完全跨平台。

一个zlibarchive在与钩iu.py因此,一个小程序,存档模块可以进口透明。即使压缩在9级,这证明是高于正常进口。而不是寻找sys.path,有一个查询的词典。那里没有统计荷兰的坪。热解。并没有打开文件(该文件已打开)。只是有一个追求,一读减压。回溯将点源文件档案条目(的创建__file__从时间属性热解。汇编)。在用户的盒子没有安装,这不是非常有用,但如果他们给你回溯,至少你可以利用它的意义。

zlibarchiveimage

carchive

一个carchive包含任何你想要的东西进去。这是非常就像一个邮政编码。文件。它们很容易创建在巨蟒打开从代码。carchives可以附加到其他文件(如精灵和最后的可执行文件,例如)。让这一点,他们打开从结束,所以总有机碳对于一个carchive在背面,之后,只有一个饼干,告诉你在哪里总有机碳开始在档案本身开始。

carchives也可以嵌入到其他carchives。本内部档案可以打开位置(不提取)。

每一个总有机碳条目是可变长度。第一场在入门告诉你长度的条目。最后一个字段的名称是相应的打包文件。这个名字是空终止。压缩可选的成员。

也有一个类型代码相关的每一个条目。如果您使用的是一个carchive作为一个邮政编码。文件,你不需要担心这个。该类型代码使用的自解压可执行文件。

carchiveimage

许可证

pyinstaller主要分布在许可的但它一个异常,你可以用它来编译商业产品。

简而言之,该许可证代码的源代码与异常:

  1. 你可以使用pyinstaller编译出你的商业应用源代码。
  2. 由此产生的二进制文件所产生的pyinstaller从源代码可以无论你想运许可证。
  3. 你可以修改您自己的需要而pyinstaller这些变化的pyinstaller源代码下的条款的许可。在其他的话,任何修改会是分布在通用公共许可证。

更新的资料或澄清,看到我们的常见问题解答pyinstaller首页。

附录

建筑的引导程序

pyinstaller附带二进制引导程序最平台,运在你的/路径/ / pyinstaller / /支持/装载机。如果你需要建立的引导为你自己的平台(因为你的平台没有正式支持,或者因为你扭曲了引导程序的源代码),你可以按照本指南。

开发工具

普通/的系统,你可以运行下面线安装一切要求:

最python-dev apt - get命令

在软呢帽/计算和衍生物,你可以运行下面的线:

苏百胜groupinstall“开发工具”安装python-devel

苹果公司的操作系统你可以得到海合会安装函数。它是一套工具开发软件的MacOSX版本。它也可以安装从您的雪豹操作系统安装光盘。它不需要安装4版本外。

在和艾克斯引导程序测试与海湾合作委员会。

在你可以使用mingw(海合会窗口)和视觉工作室+(程序)编译器。开发图书馆通常安装在一起蟒。

注:不存在之间的相互依赖视觉工作室用于编译程序和视觉工作室版本使用编译蟒。该系统是一个独立的静态的可执行文件,对没有限制的版本的Py thon使用。所以你可以使用任何你周围视觉工作室版。

你可以下载并安装或解压mingw分布从一个的以下地点:

  • mingw稳定和成熟,以3.4为基数的海湾
  • mingw-w64-最近,海湾合作委员会4.4和使用。
  • tdm-gcc- mingw和mingw-w64安装

建筑

在使用时,mingw,它是需要加入path_to_mingw \仓你的系统路径。可变的。在命令提示符之前建设引导程序的运行为例:

设置的路径:\ \ % % mingw斌;

变化的/你/路径/ / pyinstaller /子目录。运行:

pyinstaller $光盘源码pyinstaller /来源$蟒配置建设安装程式

这将产生支持/装载机/ your_os /运行支持/装载机/ your_os / run_d支持/装载机/ your_os / runw支持/装载机/ your_os / runw_d,这是引导程序。

这将产生在视窗支持/装载机/ your_os目录:跑的。(引导经常程序),和动态链接库inprocsrvr *。(引导过程中服务器)。

注:如果你有多个版本的蟒,蟒您使用运行防火墙是一个配置使用。

注:在艾克斯的引导建设与海湾合作委员会和测试与海湾合作委员会4.2.0在艾克斯6.1。

标准基础(一)二进制

默认情况下,该引导程序是位二进制文件。

是一套开放的标准,应增加中的兼容性分布。pyinstaller能够产生引导作为二进制为基础提高兼容性包装应用程序之间的分布。

注:与4版所需的成功建设引导。

在使用和ubuntu-based发行版,您可以安装到4个工具加入以下的sources.list文件库:

黛http://ftp.linux-foundation.org/pub/lsb/repositories/debian lsb-4.0主

后更新容易存放:

更新软件列表

你可以安装到4:

安装一个lsb-build-cc

大多数其他的分布与3只包含在他们的软件因此,建立知识库和工具4下载的手。从基础下载4位软件开发工具包你的建筑。

打开它:

焦油xvzf lsb-sdk-4.0.3-1.ia32.tar.gz

安装运行:

光盘lsb-sdkinstall.sh。/

安装完毕后,工具,你可以按照标准建设指令。

注:如果因为某些原因你想避免与编译,你可以这样做的——no-lsb指定的命令行信息,如下:

pyinstaller /来源$蟒大配置——no-lsb建设安装

这也产生支持/装载机/ your_os /运行支持/装载机/ your_os / run_d支持/装载机/ your_os / runw支持/装载机/ your_os / runw_d,但他们不会与二进制文件。

mf.py:一个modulefinder置换

模块中频是仿照后国际单位

它还使用importdirectors业主分区的进口的名字空间。除了事实,这些返回模块实例而不是真正的模块对象,它们是相同的。

相反的importmanager中频有一个importtracker管理。

importtracker

importtracker可以说是双向的:analyze_one(名字,importername =没有)analyze_r(名称,importername =没有)。本二方法做什么modulefinder -递归查找所有模块的名称,输入名字会出现在sys.modules。第一种方法是递归的。这是非常有用的,因为它是唯一的方式回答这个问题“谁进口名字吗?”但因为它是有点不切实际(极少数真正的进口不涉及递归),这值得一些解释。

analyze_one()

当一个名字是进口的,有结构和动态的影响。动态效果是由于执行顶层模块中的代码(或模块),进口。结构作用和是否进口的相对或绝对的,以及是否是一个点缀的名字(如果有在名称中的点,然后+ 1模块将进口甚至没有任何代码运行)。

该analyze_one方法确定结构的影响,并延迟动态的影响。比如说呢。analyze_one(“公元”,“”)可以返回[“乙”,“公元”][“A”,“新”]取决于进口原来是相对或绝对的。此外,importtracker模块将他们的模块实例。

模块类

有子的内建模块,扩展,包和(正常)模块。除了正常的模块对象属性,他们有一个属性进口。程序包和正常的模块,进口列表是一个人口稠密的扫描代码对象(为此,本列表中的名字可能是相对的或绝对的名字-我们不知道直到他们进行了分析)。

精明的高度会注意到有一个洞analyze_one()在这里。第一件事发生在公元前是进口的是进口和它的顶级代码执行的。顶层代码可以做各种事情,当进口公元前最后,完全不同的东西发生(从一个结构分析预测)。但是中频可通过处理这是挂钩的机制。

扫描码

喜欢modulefinder,中频扫描字节代码的一个模块,寻找进口。此外,中频将挑出一个模块__all__属性,如果它建立一个名单的常量名称。这意味着,如果一个包声明__all__名单的名字列表,importtracker将跟踪这些名字如果要求分析*包。。代码扫描也注意到发生__import__执行的评价,并能时发出警告他们发现。

代码扫描也可以追踪(以及它的上下文中)进口。它承认当进口被发现在顶层,当他们内发现的定义(推迟进口)。其中,还跟踪无论是进口是在一个条件(条件进口)。

在modulefinder,扫描码代替执行代码对象。extensionmodules,当然,不要扫描,所以需要有一个记录方式进口他们。

请阅读上市进口隐患更多信息。

中频更进一步,允许一个模块被钩(后已扫描,但在analyze_one与它完成)。钩是一个模块hook-fully.qualified.namepyinstaller.hooks软件包。

这些模块应该有一个或多个以下三个全球名称定义:

hiddenimports

一个模块列表名称(相对或绝对)的模块进口一些一样不可预测的方式。

这扩展模块列表是进口的,创造的通过扫描码。

示例:

hiddenimports = [ '_proxy ','工具','代码' ]
数据

名单的水珠文件或目录束数据文件。为每个水珠,指定目标目录。

示例:

数据= [(' /使用/分享/图标/ education_ *。巴纽','图标'),(' /使用/分享/ libsmi / MIB / * ',' MIB '),]

这将复制所有iconfiles匹配education_ *巴纽。进入子目录图标和递归复制内容/使用/分享/ libsmi / MIB进入管理信息库

名单(名称,值)对(其中价值一般意义)。

这将使module-attribute名字价值对于每一个坚持列表。这是没有意义的,因为模块是不执行。

这主要存在这样importtracker不会发出虚假的警告当最右边的节点在一个点缀的名字原来是属性在包装,而不是失踪的子模块。

例如:参见pyinstaller /钩/ hook-xml.dom.ext.py

钩(国防部)

一个函数的期望模块实例和返回一个模块实例(所以它可以修改或替换)。

存在这样一个动态修改包装的__path__或反常的情况,如__init__扩展。更换本身sys.modules_xmlplus __init__。。(需要九个钩子模块正确通过跟踪pyxml-using代码,我不相信这是任何更容易为穷人的程序员使用,包)。

钩(国防部)(如果存在)是所谓的看着眼前别人,这样可以,例如,测试sys.version与调整的hiddenimports

使用先进的钩

既然钩子模块进口像任何其他模块,你可以使用任何Py thon代码,我们需要。例如colletiong附加数据或文件。看到现有的挂钩pyinstaller /挂钩一些例子,特别迪亚哥钩。

警告

importtracker有一个getwarnings()方法返回的所有警告积累的实例,并通过模块实例在模块要求一般,它是importtracker谁会呢积累的过程中产生的结构相的警告,和模块将得到的代码扫描过程中产生的警告。

请注意,使用钩子模块,你可以沉默一些特别烦人的警告,但他们都没有。

交叉参考

一旦一个完整的分析(即,一个analyze_r电话)已经做了,你可以得到一个交叉参考使用getxref()。这将返回元组的列表。每个元组是(模块名,进口商),在那里进口商名单的(完全合格的)名字的模块进口模块名。两返回列表和进口商列表排序。

中频用法

一个简单的例子如下:

> > >进口中频> > > = importtracker()中频。> > > a.analyze_r(“操作系统”)[ 'os ','系统',' posixpath ','新台币','属性','字符串','停止',是的,'中的',' ntpath ',' dospath ',' macpath ',' Win 32 API ',“userdict ','复制','类型','代表','临时文件' ]> > > a.analyze_one(“操作系统”)[ 'os ' ]> > > a.modules ' ] [ 'string进口。[('strop’,0,0),('strop。*’,0,0),(是的,1,1)]> > >

元组的进口清单(名称,延迟,有条件)。

> > >为瓦a.modules [ 'string”]。警告:打印瓦…魏:延迟评价黑客检测线359魏:延迟评价黑客检测线389魏:延迟评价黑客检测线418> > >为瓦特的getwarnings():打印瓦…女:没有模块名叫密码(延迟,有条件的进口posixpath)女:没有模块名叫司(有条件的进口操作系统)女:没有模块(有条件的进口的嵌入式操作系统)女:没有模块命名的(有条件的操作系统)女:没有模块名叫麦克(有条件的操作系统)女:没有模块命名macfs(延迟,有条件的进口的临时文件)女:没有模块命名macfs(延迟,有条件的进口的临时文件)魏:顶级条件执行语句检测线47操作系统(三:\ \ \ \ Py thon程序文件库的操作系统。坪)魏:延迟评价黑客检测线359字符串(丙:\ \ \ \ Py thon程序文件中的字符串。坪)魏:延迟评价黑客检测线389字符串(丙:\ \ \ \ Py thon程序文件中的字符串。坪)魏:延迟评价黑客检测线418字符串(丙:\ \ \ \ Py thon程序文件中的字符串。坪)> > >

iu.py:一imputil置换

模块国际单位发展出了开创性的工作,格雷戈斯坦与imputil(实际上,它包括一些逐字imputil代码,但因为格雷戈没有版权,我们不会提到它)。两模块可以接管的内建的进出和易写的至少某些种类的进口钩。

国际单位不同于imputil:*更快*内置进口较好的仿真*更易于管理

有一个importmanager它提供了内置的进口替代和隐藏的所有语义复杂的Py thon进口要求从它的代表。

importmanager

importmanager正式的概念,一个metapath。这一概念含蓄存在于本地蟒,内建和冷冻模块搜索前sys.path(上,也有一个搜索注册表时麦克,资源可以搜索)。这是一个列表metapath填充importdirector实例。有importdirector子类为内建,冷冻模块,模块(窗口)发现通过注册表和pathimportdirector处理sys.path。对于一个顶级进口(即,不进口的一个模块在一个包),importmanager每次尝试它的metapath直到导演成功的。

importmanager隐藏语义复杂性的进口从董事。它是最多的importmanager决定是否进口是相对或绝对的;看看模块已经进口;保持sys.modules上日期;处理fromlist并返回正确的对象模块。

importdirector

一个importdirector只需要回复getmod(名称)由返回一个对象模块或没有。正如你将看到的,一个importdirector可以考虑的名称是原子-它不需要检查看它是否是星罗棋布的名字。

看到它是如何工作,我们需要检查pathimportdirector

pathimportdirector

pathimportdirector类管理一个列表的名称,最值得注意的是,sys.path。这样做,它保持了shadowpath -词典的名称映射的pathlist(例如,sys.path)到相关的业主。(也可以直接这样做,但假设sys.path占完全由字符串似乎根深蒂固的。)业主在适当的类创建为(如果你需要进口是满意的第一要素sys.path,这pathimportdirector的shadowpath只会有2项)。

业主

一个业主就像是importdirector但经营多更具体一片草坪。比如说呢dirowner管理一个目录。由于没有其他正式承认filesystem-like命名空间导入,这一切,包括在国际单位,但它很容易想象业主为压缩文件(和我一个为我自己中碎。档案格式)或网址。

importdirectors,一个业主只需要回复getmod(名称)返回一个对象模块或没有,它可以考虑的名称是原子。

这样的结构,我们有一个树,根的importmanager。在下一阶段,我们有一套importdirectors。至少有一个董事,该pathimportdirector负责sys.path,有另外一层下方,由业主。这么多的该树覆盖整个顶级进口命名空间。

其余的进口命名空间是由小乔木,每个植根于封装模块(一__init__坪。)。

软件包

为了使这项工作,业主需要认识到当一个模块是一个软件包。对于一个dirowner,这意味着是一个子目录它包含一个__init__坪。。本__init__模块加载和其__path__初始化子目录。然后,一pathimportdirector创建管理__path__。最后新pathimportdirectorgetmod被分配给包装的__importsub__功能的。

当一个模块包内的进口,请求路由(由importmanager)直接到包裹的__importsub__。在一个分层命名空间(如文件系统),这意味着__importsub__(这真的是一getmod约束方法pathimportdirector实例)只需要的模块名称,不包的名称或完全合格的名称。而这正是它获取。(在一个平面-最喜欢档案-很容易路由请求包起来了树的档案业主排位赛的名字,在每一个步骤。)

可能性

让我们说我们要导入的文件。所以,我们的子类业主。本__init__方法应采取一个文件名,并提高了valueerror如果该文件是不可接受的邮政编码。文件,(当新的名字是遇到的sys.path或一包的__path__,注册业主尝试到接受的名称)。本getmod方法将检查压缩文件的内容并返回没有如果名称是没有发现。否则,它会提取编组代码对象从拉链,创建一个新对象模块和执行一些初始化(12行代码都告诉我自己档案格式,包括初始化包与它的__subimporter__)。

一旦新业主类注册国际单位,你可以把压缩文件sys.path。一个包,甚至可以把一个压缩文件,其__path__

兼容性

此代码已经过测试的pyxml,mxbase和Win 32包,覆盖十几个进口黑客操纵__path__更换模块sys.modules与不同的人。仿真的本土进口几乎是准确的,包括名字记录sys.modules和模块属性(包通过输入国际单位有一个额外的属性—__importsub__)。

性能

在大多数情况下,国际单位是低于内置进口(15至20%)但速度比imputil(15 - 20%)。插入档案在前面的sys.path包含标准库和包在测试中,这可以减少到5至10%慢(或者,在我的1.5210%盒,快!)比内置进口。一点可以被剃掉的操纵的importmanager的metapath。

局限性

此模块没有试图促进政策的进口黑客。它是容易的实施各种政策在一个特定的领域,但从根本上国际单位工程划分成独立的进口命名空间域。

很简单,我认为跨域进口黑客是一个非常糟糕的主意。作者在原包装上pyinstaller是的,麦克米伦曾与进口黑客多年。他们中的许多人都是脆弱的;他们往往依赖对无证(甚至可能意外)功能的实现。跨域进口哈克是不可能与pyxml,例如。

那咆哮,你可以修改importmanger实施不同的政策。例如,一个版本,实现三进口原:绝对进口,进口相对,recursive-relative进口。不知道的语法为应该是,但是__aimport____rimport____rrimport__实现简单。

国际单位的使用

这里是一个简单的例子使用国际单位作为一个内建的进口替代。

> > >进口国际单位> > >国际单位。importmanager() install()。> > >> > >进口日期> > > __importsub__日期时间。<方法pathimportdirector.getmod825900 >的pathimportdirector实例> > 
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值