pyinstaller 打包(图片,文本)

1.1.打包方式: 

1)你可以直接在控制台运行,不太方便。
2).在程序中运行推荐。见下面例程
3) 打包文件为xx.py或xx.spec都可以,建议用xx.py方便修改。或者打包后不满意在打开xx.spec做局部修改也可。

1.2.注意:

安装最好用conda安装,最好不要用pycharm之类的平台
路径注意事项见下文

==================================================================================

2.1.路径

print('1. hello start...')
import os,sys,time
def app_path():
    """
    返回一个程序的执行路径;源代码中使用路径时,以app_path()的返回值作为基准路径,其它路径都是其相对路径
   官网:https://pyinstaller.readthedocs.io/en/stable/usage.html

   """

   if hasattr(sys, 'frozen'):#判断目前是否是直接执行
      # Handles PyInstaller
      print('1.exe目录:sys.executable=', sys.executable)
      print('2.exe目录:os.path.dirname=', sys.executable)
      return os.path.dirname(sys.executable)#使用pyinstaller打包后的exe目录
      # sys.executable='C:\\ProgramData\\Anaconda3\\python.exe' 获取可执行文件路径
      # os.path.dirname='C:\\ProgramData\\Anaconda3'
   else:
      print('3.py目录:os.path.dirname(__file__)=',os.path.dirname(__file__) )
      return os.path.dirname(__file__) #没打包前的py目录
def savelog(file,log):
    dirname = os.path.dirname(file)#返回文件脚本的路径
    if not os.path.exists(dirname):
        os.mkdir(dirname)#创建目录
    with open(file,'a',encoding='utf-8') as f:
        f.write(log+'\n')
if __name__=='__main__':
    file = app_path()+r'\log\2.txt'
    print('4.file=',file)
    savelog(file,'hello you')
    savelog(file,'文件路径%s' %(file))

time.sleep(5)
2.2.获取系统路径方法:D:\PycharmProjects\test_py36\hello.py
import os,sys
print('1=',sys.path[0])
print('2=',sys.argv[0])
print('3=',os.path.dirname(os.path.realpath(sys.executable)))
print('4=',os.path.dirname(os.path.realpath(sys.argv[0])))
print('5=',__file__)
print('6=',os.path.realpath(__file__))
#pycharm平台运行
# 1= D:\PycharmProjects\test_py36
# 2= D:/PycharmProjects/test_py36/hello.py
# 3= C:\ProgramData\Anaconda3
# 4= D:\PycharmProjects\test_py36
# 5= D:/PycharmProjects/test_py36/hello.py
# 6= D:\PycharmProjects\test_py36\hello.py
#exe运行
# F:\dist\hello>hello
# 1= F:\dist\hello\base_library.zip
# 2= hello
# 3= F:\dist\hello
# 4= F:\dist\hello
# 5= hello.py
# 6= F:\dist\hello\hello.py
3.调用Python文件与打包文件不在一个文件夹:

import sys
sys.path.append(r'D:\PycharmProjects\test_py36')
import hello#hello.py 
# 调用hello.py里面函数:
hello.Ui_Dialog().setupUi(dlg)
    
# 打包时将hello.py所在文件夹放在pyinstaller打包语句中:
pyinstaller -D -w %name% -p "D:\\PycharmProjects\\test_py36"

================================================================

4.打包方式
# -*- coding: utf-8 -*-
import os
from PyInstaller.__main__ import run
       
def compile_exe_first(filename):
    if __name__ == '__main__':
        opts =[ '-D','-c',
            # 直接导入数据图片不会被压缩(应将资源转为.dll或二进制文件)
            '--add-binary=D:/PycharmProjects/test_py36/resource/picture/*.jpg;resource/picture',
            '--add-binary=D:/PycharmProjects/test_py36/resource/icon/*.ico;resource/icon',  #导入图片.dll文件
            # '--add-binary= D:/PycharmProjects/test_py36/upx/upx.exe;./', #导入.exe文件
            r'--add-data=D:\PycharmProjects\test_py36\data\tcy.txt;resource\data',  #导入数据文件
            r'--add-data=D:\PycharmProjects\test_py36\data\fun.htm;resource\data',  #导入数据文件
            # '--hidden -import = shutil.grp',
            #修改你要附件的路径
            '--paths=D:\\PycharmProjects\\test_py36',
            '--paths=D:\\PycharmProjects\\test_py36\\upx',
            '--paths=D:\\PycharmProjects\\test_py36\\resource\\picture',
            '--paths=D:\\PycharmProjects\\test_py36\\resource\\icon',
            '--paths=C:\\ProgramData\\Anaconda3\\Library\\plugins\\PyQt5',
            '--paths=C:\\ProgramData\\Anaconda3\\Library\\bin',
            '--paths=C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\PyQt5',
            '--paths=C:\\ProgramData\\Anaconda3\\Lib\\site-packages',
            '--icon', 'D:/PycharmProjects/test_py36/resource/icon/icon.ico',
            '--clean',   #'--noupx', '--upx-dir=./',
            filename    #pyqt5_test.spec
                    ]
    run(opts)    
filename='client.py'  #pyqt5_test.spec
compile_exe_first(filename)
说明:
安装pyinstaller:最好从Anaconda Navigator平台安装 pyinstaller3.4,不要从pycharm中安装
版本:pyinstaller3.4,python3.6.5
注意:路径中不要有中文,使用相对路径
    
# 4.2.pyinstaller打包方式2:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#以上必须包含
import os
def compile_exe(py_path,pyinstaller_path):
    """
    :param py_path: 获取需要转换的.py格式文件位置
    :param pyinstaller_path: 指定pyinstaller.exe位置
    :return: None
    说明:此种方式本打包开始执行文件开头必须加# -*- coding: utf-8 -*-
    """
        
    file_path = py_path.rpartition('\\')[0] + '\\'# 转换后文件的放置目录
    print(file_path)
    # 指定三个选项的文件路径
    dist_path = file_path + 'dist'
    build_path = file_path + 'build'
    spec_path = file_path
    # 选项
    options = ' -D' +r' --add-data=' \
             r'D:\PycharmProjects\test_py36\resource\picture\girl.jpg;resource\picture' +\
              ' --distpath ' + dist_path +\
              ' --workpath ' + build_path + \
              ' --specpath ' + spec_path + ' '
    # 调用系统命令
    os.system('python ' + pyinstaller_path + options + py_path)
    
def test_compile_exe():
    py_path=r'D:\PycharmProjects\test_py36\pyqt5_test.py'
    pyinstaller_path=r'C:\ProgramData\Anaconda3\Scripts\pyinstaller-script.py'
    compile_exe(py_path,pyinstaller_path)
        
# test_compile_exe()
==================================================================================
5.pyinstaller命令的语法:

pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME]#【-h显示帮助信息】【-v显示版本】
       [--add-data <SRC;DEST or SRC:DEST>]
            [--add-binary <SRC;DEST or SRC:DEST>] [-p DIR]
            [--hidden-import MODULENAME]
            [--additional-hooks-dir HOOKSPATH]
            [--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES]
            [--key KEY] [-d [{all,imports,bootloader,noarchive}]] [-s]
            [--noupx] [-c] [-w]
            [-i <FILE.ico or FILE.exe,ID or FILE.icns>]
            [--version-file FILE] [-m <FILE or XML>] [-r RESOURCE]
            [--uac-admin] [--uac-uiaccess] [--win-private-assemblies]
            [--win-no-prefer-redirects]
            [--osx-bundle-identifier BUNDLE_IDENTIFIER]
            [--runtime-tmpdir PATH] [--bootloader-ignore-signals]
            [--distpath DIR] [--workpath WORKPATH] [-y]#【文件exe存放目录】【临时工作文件】
            [--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL]
            scriptname [scriptname ...]#文件名.py
1.1.常规选项
-h, --help            显示此帮助消息并退出
-v, --version         显示程序版本信息并退出。
--distpath DIR        生成可执行文件exe存放目录(默认:./dist)
--workpath WORKPATH   临时工作文件目录,.log,.pyz等(默认值:./build)
-y, --noconfirm       替换输出目录(默认值:SPECPATH/dist/SPECNAME)而不要求确认

--upx-dir UPX_DIR     UPX实用程序的路径(默认:搜索执行路径)
-X, –-upx             如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(压缩包下载:https://github.com/upx/upx/releases/tag/v3.95
-a, --ascii         不包括unicode编码支持(默认支持)
--clean             在构建之前清理PyInstaller缓存并删除临时文件(build文件夹下)
--log-level LEVEL   构建时控制台消息中的详细信息量。
                    LEVEL可能是DEBUG,INFO,WARN,ERROR,CRITICAL(默认值:INFO)之一。
1.2.要生成什么
-D, --onedir         创建包含可执行文件的单文件夹包(默认)
-F, --onefile        生成单独exe文件
--specpath DIR       存储生成spec文件文件夹(默认:当前目录)
-n NAME, --name NAME 可选(产生spec)名字(默认:第一个脚本的基本名称)
1.3.捆绑什么,在哪里搜索
--add-data <SRC;DEST or SRC:DEST>  #导入.txt等数据文件;windows用分号分割
--add-binary <SRC;DEST or SRC:DEST>#导入图片.dll等二进制资源
            参考:https://blog.csdn.net/weixin_43049973/article/details/82725699
  
-p DIR, --paths DIR 搜索导入路径;允许多路径,以“;or :”分隔,或多次使用此选项
--hidden-import MODULENAME, --hiddenimport MODULENAME
                    命名在脚本代码中不可见的导入。此选项可以多次使用。
--additional-hooks-dir HOOKSPATH
                    搜索钩子的另一个路径。此选项可以多次使用。
--runtime-hook RUNTIME_HOOKS
                    自定义运行时挂接文件的路径。运行时挂钩是与可执行文件捆绑在一起的代码,
                    在任何其他代码或模块之前执行,以设置运行时环境的特殊功能。此选项可以多次使用。
--exclude-module EXCLUDES
                    可选模块或包(他的Python名称,而不是路径名)将被忽略(好像没有找到)。此选项可以多次使用。
--key KEY           用于加密Python字节码的密钥。
1.4.如何生成
-d, --debug    编译为debug模式,获取运行中日志信息,查看编译错误。
               在初始化和启动捆绑的应用程序时,告诉引导加载程序发出进度消息。用于诊断丢失导入的问题。

-s, --strip    将符号表条应用于可执行文件和共享库(不推荐用于Windows)

--noupx        不用UPX压缩(Windows和* nix之间的工作方式不同)
1.5.Windows和Mac OS X特定选项
-c, --console, --nowindowed  打开标准控制台窗口(默认)
-w, --windowed, --noconsole  无控制台窗口(不指定会带dos窗口)
   
-i <FILE.ico or FILE.exe,ID or FILE.icns>,   #-i manage.ico,ico格式,指定图标路径
--icon <FILE.ico or FILE.exe,ID or FILE.icns>
   FILE.ico:将该图标应用于Windows可执行文件。
   FILE.exe,ID,从exe中提取带有ID的图标。
   FILE.icns:将图标应用于Mac OS X上的.app包
   
实例:-icon=<FILE.EXE,N>  将file.exe的第n个图标添加为可执行文件的资源
   
1.6.Windows特定选项
--version-file FILE                        从FILE添加版本资源到exe

-m <FILE or XML>, --manifest <FILE or XML> 将清单FILE或XML添加到exe
-r RESOURCE, --resource RESOURCE           将资源添加或更新到Windows可执行文件。可以多次使用
    RESOURCE是一到四个项目,FILE [,TYPE [,NAME [,LANGUAGE]]]。
    FILE可是数据文件或exe/dll。对于数据文件,必须至少指定TYPE和NAME。
    LANGUAGE默认为0或可以指定为通配符*以更新给定TYPE和NAME的所有资源。
    exe/dll文件如省略TYPE,NAME和LANGUAGE或将其指定为通配符*,则将FILE中的所有资源添加/更新到最终可执行文件。
    
--uac-admin       使用此选项会创建一个Manifest,它将在应用程序重新启动时请求提升。
--uac-uiaccess    使用此选项可以使提升的应用程序与远程桌面一起使用。
1.7.Windows并排程序集搜索选项(高级)
--win-private-assemblies
     捆绑到应用程序中的任何共享程序集都将更改为专用程序集。这意味着将始终使用这些程序集的确切版本,
     并且将忽略系统级别的用户计算机上安装的任何较新版本。
--win-no-prefer-redirects
     在搜索要捆绑到应用程序中的共享或专用程序集时,PyInstaller不希望遵循重定向到较新版本的策略,
     并会尝试捆绑程序集的确切版本。
       
   
1.8.Rarely used special options:
  --runtime-tmpdir PATH
                        Where to extract libraries and support files in
                        `onefile`-mode. If this option is given, the
                        bootloader will ignore any temp-folder location
                        defined by the run-time OS. The ``_MEIxxxxxx``-folder
                        will be created here. Please use this option only if
                        you know what you are doing.
实例:windows
pyinstaller -h 显示帮助信息
pyinstaller -c  xxxx.py
pyinstaller xxxx.py --console
pyinstaller.exe -F -w D:\PycharmProjects\test_py36\build\pyqt5_test\pyqt5_test.py
pyinstaller -F -i manage.ico yourpyfile.py --hidden-import PyQt5.sip#屏蔽掉子包

pyinstaller -D -w -p D:\PycharmProjects\test_py36;D:\PycharmProjects\test_py36\picture;\
C:\ProgramData\Anaconda3\lib\site-packages; \
-i D:\PycharmProjects\test_py36\picture\icon.ico pyqt5_test.py

pyinstaller -D --add-data gril.jpg -p D:\PycharmProjects\test_py36;\
D:\PycharmProjects\test_py36\picture -w pyqt5_test.py
 
pyinstaller --noconfirm --log-level = WARN ^
--onefile --nowindow ^
--hidden-import = secret1 ^
--hidden-import = secret2 ^
--icon = .. \ MLNMFLCN.ICO ^
myscript.spec
D:\pythonWork\baiduai>pyinstaller -F machine1.py --hidden-import \
   --hidden-import email.mime.image

猜你喜欢

转载自blog.csdn.net/tcy23456/article/details/88536612