pyinstaller打包工具的使用说明

    xiaoxiao2021-08-20  112

    打包命令

    pyinstaller可以将python代码打包为可执行的exe文件,一般应用只需要使用如下命令:

    C:\Python27\python.exe C:\pyinstaller-2.0\pyinstaller.py src\wgClient.py 执行该命令后将在当前目录下生成build和dist文件夹,另外还会生成一个wgClient.spec文件,用于描述pyinstall的打包过程,如果对打包有特殊要求时,可以直接编辑spec文件,然后将spec文件作为打包时的输入对象: C:\Python27\python.exe C:\pyinstaller-2.0\pyinstaller.py wgClient.spec spec文件

    下面附上一段spec文件的示例代码,结合示例说明一些打包过程中的一些特殊要求:

    -*- mode: python -*-     a = Analysis(['src\\wgClient.py'],      pathex=['D:\\PycharmProjects\\wgClientPy'],      hiddenimports=[],      hookspath=None)     pyz = PYZ(a.pure)     exe = EXE(pyz,      a.scripts,      a.binaries,      a.zipfiles,      a.datas,      [('logging.conf', 'src/logging.conf', 'DATA')],      [('clr.pyd', 'C:\\Python27\DLLs\\clr.pyd', 'EXTENSION'),      ('Python.Runtime.dll', 'C:\\Python27\DLLs\\Python.Runtime.dll', 'BINARY'),      ('Python.Runtime.pdb', 'C:\\Python27\DLLs\\Python.Runtime.pdb', 'BINARY'),      ('n3kAdrtB.dll', 'src\\n3kAdrtB.dll', 'BINARY') ],      name=os.path.join('build\\pyi.win32\\wgClient', 'wgClient.exe'),      debug=False,      strip=None,      upx=True,      console=True )     coll = COLLECT(exe,      [('config.ini', 'src/config.ini', 'DATA')],      strip=None,      upx=True,      name='dist') 上面的Analysis、PYZ、EXE、COLLECT都是事先定义的子任务。

    Analysis

    用于定义python源文件,包括搜索路径,源文件名称等。Analysis有5个输出项,可供其他子任务引用:

    scripts:在Analysis中定义的源文件 pure:python模块 binaries:动态库 datas:数据文件,可以是任意文件类型,例如ini配置文件、字体文件、图片等 zipfiles:zip格式的依赖文件,一般是egg格式的库文件

    PYZ

    将python文件压缩打包,输入一般是Analysis.pure.

    EXE

    打包生成exe文件,从上面的例子中可以看出,EXE子任务包含了Analysis的所有5个输出项(pure被PYZ打包了),另外还包含程序运行所需的一些配置文件和动态库,这些不在Analysis输出项中的文件是通过TOC格式来配置的,TOC(Table Of Contents),TPC其实就是一个tuple,格式为(name, path, typecode),其中typecode可以为以下值:

    EXTENSION:python的扩展库 PYSOURCE:python脚本 PYMODULE:A pure Python module (including __init__modules). PYZ:A .pyz archive (archive_rt.ZlibArchive) PKG:A pkg archive (carchive4.CArchive) BINARY:动态库 DATA:数据文件 OPTION:A runtime runtime option (frozen into theexecutable).

    COLLECT

    用来构建最终的生成目录,可以复制其他子任务生成的结果,并拷贝到指定目录,形成最终的打包结果。

    示例中的spec文件,会在dist目录下生成一个wgClient.exe的可以执行文件,里面包含所有的依赖项,可以独立运行,同时该目录下还有config.ini配置文件。

    文件路径

    上例中,将logging.conf文件直接打包在exe内部了,python在读取时应使用以下方式读取文件路径:

    if getattr(sys, 'frozen', None):      basedir = sys._MEIPASS else:      basedir = os.path.dirname(__file__) logging.config.fileConfig(os.path.join(basedir, 'logging.conf'))

    扩展名

    在写Python程序时我们常见的扩展名是py, pyc,其实还有其他几种扩展名。下面是几种扩展名的用法。

    py

    py就是最基本的源码扩展名。windows下直接双击运行会调用python.exe执行。

    pyw

    pyw是另一种源码扩展名,跟py唯一的区别是在windows下双击pyw扩展名的源码会调用pythonw.exe执行源码,这种执行方式不会有命令行窗口。主要用于GUI程序发布时不需要看到控制台信息的情况。

    pyc

    在执行python代码时经常会看到同目录下自动生成同名的pyc文件。这是python源码编译后的字节码,一般会在代码执行时自动生成你代码中引用的py文件的pyc文件。这个文件可以直接执行,用文本编辑器打开也看不到源码。

    pyo

    pyo是跟pyc类似的优化编码后的文件。

    pyd

    pyd并非从python程序生成,而是其他语言写成的可以被python调用的扩展。

    程序发布的选择

    由于笔者基本只在windows平台下考虑发布问题,其他平台均使用源码,故此处讨论基本围绕windows平台。

    打包为正常exe程序

    如果要公开发布程序,最常见的方式就是打包成exe程序了。打包的好处是使用者不需要考虑Python的运行环境,且也容易被接受。但不好的是一般打包出来的程序都比较大,而且由于是依靠模块打包,有可能出现兼容性等问题。

    笔者常用的打包模块是pyinstaller。常用的打包命令是:

    pyinstaller -F example.py

    -F参数可将代码打包成单个exe程序。

    另外如果是GUI程序不需要控制台窗口的还可以加上-w参数:

    pyinstaller -w -F example.py

    发布编译后的pyc/pyo

    如果使用者有python环境,又不想让他们看到源码,就可以选择发布pyc/pyo文件。

    直接执行的py文件不会自动生成pyc,需要手动编译一下。单文件编译:

    import py_compile py_compile.compile(r'c:\test.py') 12 12

    文件夹编译:

    import compileall compileall.compile_dir(dirpath) 12 12

    编译成pyo:

    python -O -m py_compile file.py

    如果是GUI程序不需要控制台窗口,可以新建一个pyw文件用于调用主pyc程序。pyw中只需要导入pyc程序即可。

    发布源码py

    发布源码一般是开源项目使用的,没什么需要说明的。直接发py文件就可以了,只要对方有环境就可以运行。

    参考资料:

    《python 文件 .py .pyc .pyw .pyo .pyd》http://blog.csdn.net/feeltouch/article/details/45952003《Python程序的执行原理》http://tech.uc.cn/?p=1932《python的pyc和pyo文件》http://gmingzhe.blog.51cto.com/810664/163444《运行Python程序(pyc)隐藏DOS窗口的简便方法》https://apfantasy.wordpress.com/2011/02/13/运行python程序pyc隐藏dos窗口的简便方法/《py文件编译为pyc》http://blog.csdn.net/sislcb/article/details/4002414
    转载请注明原文地址: https://ju.6miu.com/read-676757.html

    最新回复(0)