PyInstaller入门(二)——__import__ ()无法被识别的问题和spec文件的使用

pyinstaller无法识别问题

为了找出你的python文件的所有依赖项,pyinstaller会查看你的python脚本中所有的import声明 ,找到所有导入的模块,直到拥有了你的python脚本执行所需的所有模块的完整列表。
PyInstaller可以识别出python包常用的”egg”格式,所以,如果你的脚本是从一个”egg”中导入一个模块,那么pyinstaller将会把egg和它的依赖项一并添加进来。
一些常用的GUI包目前也都被pyinstaller支持,例如:Qt,WxPython, TkInter, Django等等。
或许你的一些脚本中使用了import()等格式的导入,这是pyinstaller无法识别的包导入格式,或者在运行时操作sys.path的值等等。这些都是pyinstaller无法直接识别的。需要你手动做一些其他的工作帮助pyinstaller识别这些内容。

  • 通过向pyinstaller添加需要的文件或者路径
  • 编辑 你的文件名.spec文件来添加pystaller无法自动识别的内容(后续将详细介绍)
  • 写hook文件来提醒pyinstaller那些隐藏的import

使用命令行添加未识别的import模块

pyinstaller –hidder-import=ModuleName hello.py

spec文件的使用

当你执行

pyinstaller options.. myscript.py

的时候,pyinstaller做的第一件事情就是生成一个myscript.spec文件,这个文件在–specpath=文件夹下,默认情况下是在当前路径下。
spec file如下:

block_cipher = None
a = Analysis(['minimal.py'],
     pathex=['/Developer/PItests/minimal'],
     binaries=None,
     datas=None,
     hiddenimports=[],
     hookspath=None,
     runtime_hooks=None,
     excludes=None,
     cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
     cipher=block_cipher)
exe = EXE(pyz,... )
coll = COLLECT(...)

包含了你的脚本名字以及你给pyinstaller命令的各种选项。多数情况下,使用命令行是足够的,但以下几种情况需要你修改spec file文件:

  • 想要将数据文件捆绑到应用程序中
  • 想要包含run-time库(.dll或.so文件)
  • 想要添加python的run-time选项
  • 想要创建具有合并公共模块的多程序包
    首先,使用下面的命令创建一个spec file:

pyi-makespec options name.py [other scripts …]
在spec file中,你会看到四个类: Analysis, PYZ, EXE 和 COLLECT。

  • Analysis使用列表列出所有输入的python脚本。它会分析所有的导入包和依赖项,并将结果赋给输出对象(例子中的a)。a是一个列表的形式,包含如下几项:
    scripts:所有输入python脚本;
    pure:输入脚本中命名的纯python模块;
    binaries:脚本中需要的非python模块;
    datas:应用包含的非二进制文件。

  • pyz:该类的一个实例将包含a.pure中的所有python模块;

  • EXE: 该类的一个实例将生成可执行文件;
  • COLLECT:该类的一个实例将创建一个包含除上述内容以外的其他所有部分的输出文件;

    向Analysis中添加内容

    添加数据文件

例如添加一个src文件夹中存在的README.txt文件

a = Analysis(...
     datas=[ ('src/README.txt', '.') ],
     ...
     )

例如:添加某个文件夹下的所有.mps文件:

a = Analysis(...
     datas= [ ('/mygame/sfx/*.mp3', 'sfx' ) ],
     ...
     )

这样,所有/mygame/sfx/文件夹下的mp3文件都会被添加到你的应用中。
如果你要添加一系列的数据文件,使用下面的方式可以增加可读性:

added_files = [
         ( '/mygame/sfx/*.mp3', 'sfx' ),
         ( 'src/README.txt', '.' )
         ]
    a = Analysis(...
         datas = added_files,
         ...
         )

使用某个模块中的数据文件

如果你想要添加的某个数据文件是来源于某个python模块。
例如:你的文件中有一个叫做helpmod的模块,它包含以下几个部分:

helpmod:
init.py
helpmod.py
help_data.txt

事实上,使用命令行的pyinstaller进行压缩,像help_data.txt文件是不会被包含进去的,因此应当修改spec file文件如下:

a = Analysis(...
     datas= [ ('helpmod/help_data.txt', 'helpmod' ) ],
     ...
     )

另外一种方法:使用标准库函数 pkgutil.get_data( )在你的helpmod.py中:

import pkgutil
help_bin = pkgutil.get_data( 'helpmod', 'help_data.txt' )

你可能感兴趣的:(PyInstaller)