FC的注册很坑 发表于 2021-12-31 11:00:02

pyinstaller只打包主脚本

项目结构为一个主脚本(main.py)和很多子脚本(a.py,b.py等),但主脚本每次运行只根据输入调用一个子脚本,例如:如果输入是“a”,调用a.py;如果是“b”,调用b.py,因为经常会增加新功能,所以把这些信息放到配置文件里管理,主脚本读配置文件得知去调用哪个脚本。这样增加新功能时只需要改配置文件,和添加子脚本,其余脚本包括主脚本都不会有变动。
例如配置文件里是个字典{'a':'a.py','b':'b.py'}添加c功能后变为{'a':'a.py','b':'b.py','c':'c.py'} 主脚本中读取dict得到需要映入的脚本名,然后隐式导入。

在打包过程中发现: 隐式导入需要修改打包配置----hidden-imports 且添加子脚本后需要再次打包,造成需要反复重新打包。目前打包的目的只是给个exe入口以及Python环境(所以不用embededPython来提供环境),暂时不需要考虑防止脚本被修改等问题,所以期望只打包主脚本,得到exe入口再调用子脚本.py完成功能。

没有找到相关操作的资料,来请教各位大大们,谢谢!{:10_254:}

lightninng 发表于 2021-12-31 11:50:30

说个思路,要把你的a.py,b.py编译成so文件或者dll文件,然后主代码里从so或者dll文件中调用相应的函数。

hrpzcf 发表于 2021-12-31 12:02:10

本帖最后由 hrpzcf 于 2021-12-31 12:03 编辑

--hidden-imports只是将未被自动检测到的脚本打包进去,你手动放进去结果也一样,为什么要重新打包?(除非你是打包成单文件?)
如果你要打包成单文件,你的main的逻辑可以改成从某一固定的相对目录比如./myscripts(即与exe同目录下的myscripts文件夹)用exec(f.read())方式运行程序,也可以import .myscripts.xxx,或者将./myscripts添加到sys.path,这样可以直接import xxx,后续直接将新脚本放到myscripts就可以。

傻眼貓咪 发表于 2021-12-31 12:25:56

来看看学习

FC的注册很坑 发表于 2021-12-31 15:47:50

hrpzcf 发表于 2021-12-31 12:02
--hidden-imports只是将未被自动检测到的脚本打包进去,你手动放进去结果也一样,为什么要重新打包?(除非 ...

不是打包成单文件,是文件夹的那种,我这里试下来如果主脚本有隐式的import,如果不加到--hidden-imports一起打包,运行exe时是会报错的

FC的注册很坑 发表于 2021-12-31 15:49:18

lightninng 发表于 2021-12-31 11:50
说个思路,要把你的a.py,b.py编译成so文件或者dll文件,然后主代码里从so或者dll文件中调用相应的函数。

可以试试哎,谢谢大大,鞠躬

hrpzcf 发表于 2021-12-31 16:38:48

FC的注册很坑 发表于 2021-12-31 15:47
不是打包成单文件,是文件夹的那种,我这里试下来如果主脚本有隐式的import,如果不加到--hidden-imports ...

你的main的逻辑可以改成从某一固定的相对目录比如./myscripts(即与exe同目录下的myscripts文件夹)用exec(f.read())方式运行程序,也可以import .myscripts.xxx,或者将./myscripts添加到sys.path,这样可以直接import xxx,后续直接将新脚本放到myscripts就可以。

FC的注册很坑 发表于 2022-1-4 18:21:21

hrpzcf 发表于 2021-12-31 16:38


我都试试,来工作了,晚些给各位大大们回复进展了{:10_282:}
页: [1]
查看完整版本: pyinstaller只打包主脚本