一.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