美文网首页
pyinstaller 打包中的坑

pyinstaller 打包中的坑

作者: 羽天驿 | 来源:发表于2020-11-26 16:17 被阅读0次

    一.pyinstaller中打包的那些坑

    1.python3.5以上的到github上拉取最新的代码
    2.重点坑:
    涉及到cefpython3这个库的,这个库因为是c++写的所有在打包的时候是无法对这个库进行打包的,所以解决问题的办法在于:
    (1)告诉pyinstaller拉取
    (2)手动复制
    (3)书写脚本
    请看重点,其他的简单脚本打包都是没有问题的,百度一哈都能解决,就是关于这个cefpython3包的打包一定要注意问题

    • 有控制台输出的脚本 不要加 -w 加了就看不到了
    • -w 如果是图像化的界面进行打包,请加上
    • pyinstaller -D XX.py 可以进行Debug 看具体的错误出现在哪里
    • 打包的时候报错缺少很多的DLL文件这个不影响最后的结果,可以不用管他 解决这个问题的方法也是很简单的,直接百度就行了
    • 打包的时候可以指定 打包的图标的 和打包的路径,这些都可以百度
      最后附上专门解决针对cefpython3打包的代码:
    import cefpython3
    import subprocess
    import os
    import shutil
    
    
    class PyinstallerCefpython:
        def __init__(self):
            self.no_suffix_script_name = "hello_world"
            # cefpython3的包目录
            self.cef_dir = os.path.dirname(cefpython3.__file__)
            # 获取cefpython3包下examples目录下的hello_world.py
            self.script_file = os.path.join(os.path.join(self.cef_dir, "examples"), "hello_world.py")
    
        def delete_before_generates(self):
            """删除之前打包生成的文件"""
            print("*******正在删除之前打包的生成文件....")
            try:
                shutil.rmtree("./dist")
                shutil.rmtree("./build")
                os.remove("{}.spec".format(self.no_suffix_script_name))
            except Exception as e:
                pass
            print("*******删除成功!")
    
        def script_to_exe(self):
            # 相当于执行打包命令: Pyinstaller hello_world.py
            print("*******开始打包cefpython3应用:", self.script_file)
            subprocess.run("Pyinstaller --hidden-import json {}".format(self.script_file))
    
        def copytree(self, src, dst, ignores_suffix_list=None):
            print("********正在复制将{}目录下的文件复制到{}文件夹下....".format(src, dst))
            os.makedirs(dst, exist_ok=True)
            names = [os.path.join(src, name) for name in os.listdir(src)]
            for name in names:
                exclude = False
                for suffix in ignores_suffix_list:
                    if name.endswith(suffix):
                        exclude = True
                        continue
                if not exclude:
                    if os.path.isdir(name):
                        new_dst = os.path.join(dst, os.path.basename(name))
                        shutil.copytree(name, new_dst, ignore=shutil.ignore_patterns(*ignores_suffix_list))
                    else:
                        shutil.copy(name, dst)
    
        def solve_dependence(self):
            print("*******解决依赖:复制依赖文件到执行文件的目录下....")
            self.copytree(self.cef_dir, "./dist/{}".format(self.no_suffix_script_name), [".txt", ".py", ".log", "examples", ".pyd", "__"])
    
        def exec_application(self):
            print("*******执行成功打包的应用....")
            subprocess.run("./dist/{0}/{0}.exe".format(self.no_suffix_script_name))
    
        def run(self):
            self.delete_before_generates()
            self.script_to_exe()
            self.solve_dependence()
            self.exec_application()
          
        
    if __name__ == "__main__":
      PyinstallerCefpython().run()
    

    ** 附上代码的原博主:再次感谢https://www.jianshu.com/p/1ca206b28e28

    相关文章

      网友评论

          本文标题:pyinstaller 打包中的坑

          本文链接:https://www.haomeiwen.com/subject/mwfziktx.html