Re: [问题] MEIPASS - No such file or directory er

楼主: poototo (poototo)   2022-01-25 23:35:10
le大好说,互通有无大家求进步
您看来有一个误解之处是
原PO的状况是,opencc有被打包了,但并不是所有套件下的档案都被自动打包
s2tw.json这个档是原PO要叫pyinstaller去抓来打包进exe的
并不是日后放在exe所在电脑,使用者还要确保自己电脑有这个json档跟opencc
打包成功,exe自己带着走,会当场重新产生json
而重新产生的位置,就是在sys._MEIPASS下
sys._MEIPASS,是每次exe一执行时强加sys的属性
而默认值就是OS的TEMP PATH (通常就是User目录的AppData下)
供 add-file 那些档案在日后每次exe执行时重新产生到_MEIPASS
透过_MEIPASS的设计,exe在任意电脑上执行,
一切就相对于默认TEMP,不用管exe本身所在位置或使用者名称
exe执行结束,TEMP中重新产生的资源档也会被删除
官方说明如下,再讨论
================================================
1. https://pyinstaller.readthedocs.io/en/stable/usage.html
作者: lepenseur (lepenseur)   2022-01-26 01:23:00
我明白—add-data 的档案会放在包装后目录下但是,他现在执行exe的错误内容,就是去AppData这个目录读取资料,而不是从执行档的目录下(sys._MEIPASS)抓json所以我才说,他应该要想清楚,部署的平台要怎么安排这些档案放哪里、该怎么读—add-data可以打包没错,但他程式码是从AppData这边抓资料,所以会继续报错你尝试把一个档案只放在AppData,其他目录不能放,然后尝试打包、在另一台电脑上执行看看,应该可以重现这个问题你成功打包opencc没错,东西也在sys._MAIPASS下没错,但你的程式码就跑去AppData这个目录抓资料,所以才出现这个错误提示
楼主: poototo (poototo)   2022-01-26 09:02:00
1.add-data档案【不会】放在包装后目录下,是在【exe中】2.exe执行档所在目录 != sys._MEIPASSsys._MEIPASS会指向AppData下的乱数名称目录如原PO的错误讯息中的路径有个 _MEI151842这是exe每次执行都会当场造的(所以每次执行每次都会更新一次sys._MEIPASS)import相依套件及add-data的档案都在_MEI151842下解压user无法【事先部署】这些档案,是exe自己【当场部署】原本opencc.py执行时会去读site-package下opencc下的json打包exe后,opencc.py的读取起点会换成sys._MEIPASS原PO只要将json打包【进exe】,指定正确的解压path而非要求使用者电脑中要有一份json或额外安装相依档案使用者只要执行exe就好,不必搞环境部署
作者: lepenseur (lepenseur)   2022-01-26 16:20:00
那请问你要如何指定解压到该使用者的AppData 呢?你一直忽略错误讯息里面,去AppData读取资料的这件事,我们一直在鸡同鸭讲而且真的有需要写入资料的话,一般都是直接写安装精灵,安装精灵可以做完这些事情,不会让使用者自己去设定环境sys._MAIPASS 我知道如何使用,我也是这样操作的。但现在的情境是,exe执行时尝试去AppData读取资料导致错误另外,pyinstaller 解压执行超慢,一般是小专案才会用,正式的软件几G没办法等你这样解压,建议你了解一下pyinstaller产生资料夹的操作
楼主: poototo (poototo)   2022-01-26 16:28:00
add-data就是在指定sys._MEIPASS下的解压路径AppData就是在sys._MEIPASS指向的路径当中会去读AppData下的资料就是exe的正常行为
作者: lepenseur (lepenseur)   2022-01-26 16:31:00
抱歉,刚刚去翻文件,我懂你的意思了你说的是pyinstaller -F 下的操作情形我说的是 pyinstaller -D 下的操作情形
楼主: poototo (poototo)   2022-01-26 16:33:00
你的exe还会在user电脑放很多档案才能正常执行?
作者: lepenseur (lepenseur)   2022-01-26 16:33:00
所以你才会说解压档案到_MAIPASS目录下
作者: lepenseur (lepenseur)   2022-01-26 16:34:00
我写的是要部署到客户端电脑的软件,基本上是一整个软件资料夹,档案大小有时候几百M或几G所以都不会使用 onefile长知识了功能稍微多一点,每次开启onefile解压缩就要等超久感谢poo大,让我更了解onefile的运作机制
楼主: poototo (poototo)   2022-01-26 16:40:00
刚看原PO是用 -F,但我也在想是否可以不要打包python套件import一堆,exe常100M上下,然后执行又解压套件出来
作者: lepenseur (lepenseur)   2022-01-26 16:42:00
原ok原本加上—add-data还是挂,所以我以为他路径设定错,他后面也没出来回复可能问题已经解决了不打包python套件可能比较难,就是需要用到才import的啊XD我还是觉得onedir的方式比较好用,加上安装精灵,资料夹安装在C槽,桌面建立一个捷径,方便实用

Links booklink

Contact Us: admin [ a t ] ucptt.com