HaujetZhao / PyInstaller-Perfect-Build-Method

如果我要写一个 Python 项目,打包成 exe 运行(方便在没有 Python 的电脑上使用),我需要打包出的根目录结构美观,没有多余的、杂乱的依赖文件在那里碍眼,而且需要在发现 bug 时,我还需要能够修改里面的代码后,无需再次打包,就能正常运行,该怎么做呢? 就以一个 Hello 项目为例,记一下我找到的完美方法。
97 stars 24 forks source link

添加hook.py移动文件后,程序无法启动 #1

Closed juntaosun closed 1 year ago

juntaosun commented 1 year ago

1 按你的教程,添加好runtime_hooks=['hook.py'], 然后打包,此时exe运行正常。 按教程把其它文件手动移到libs/目录中,按教程中仅留下如图所示的几个文件, 再次点击exe无法运行,报错如图,模块找不到啦~。~ 怎么解?大佬


hook.py:(用的就是你的那个hook.py文件) `import sys from pathlib import Path

BASE_DIR = Path(file).parent

for p in sys.path.copy(): relative_p = Path(p).relative_to(BASE_DIR) new_p = BASE_DIR / 'libs' / relative_p sys.path.insert(0, str(new_p))

sys.path.insert(0, str(BASE_DIR)) `

HaujetZhao commented 1 year ago

昨晚更新了,再去看 readme,新增第三部分。用里面的 spec 模板,把 numpy 加到自定义复制模块中。

juntaosun commented 1 year ago

仔细对比了一下 readme新增第三部分,里面的 spec 模板,

manual_modules = ['numpy']

打包后运行成功,感谢~!

HaujetZhao commented 1 year ago

加 qq 1292756898 我看下

HaujetZhao commented 1 year ago

应该不用改的吧,加上 libs 实际是在这一部分做的:

# 把 a.datas 中不属于自定义的文件重定向到 libs 文件夹
temp = a.datas.copy(); a.datas.clear()
for dst, src, type in temp:
    c1 =  (dst == 'base_library.zip')                 # 判断文件是否为 base_library.zip
    c2 = any([dst.startswith(f) for f in my_folders]) # 判断文件是否属于 my_folders
    c3 = any([dst.startswith(f) for f in my_files])   # 判断文件是否属于 my_files
    if any([c1, c2, c3]):
        a.datas.append((dst, src, type))
    else:
        a.datas.append((path.join('libs', dst), src, type))
juntaosun commented 1 year ago

是的,其实是加上这句就行了: manual_modules = ['numpy']

HaujetZhao commented 1 year ago

以后打包直接用那个 build-hello.spec 作为模板修改就可以了,已经写的很完善了

juntaosun commented 1 year ago

打包非常完美,生成的目录总算干净了,推荐大家使用