赞
踩
在使用pyinstaller打包过程中,打包后的文件在本机可以正常执行,但是发给朋友后,会报No such file or directory的错误,耗费多时才解决,总结一下该问题的解决方案。
对我来说,感觉这是一个重点难点,通过多次调试,成功解决。
注意点:
1)pyinstaller会把main.py执行的时候能引用到的所有py文件(不包括其它任何文件)都会按照当前代码目录的组织方式打包到main.exe里面
2)pyinstaller不会打包除了.py文件之外的其他任何文件,如.yaml、.csv、readme、xlsx、jpg等等其它文件
3)如果要打包除了.py之外的其它文件,需要我们打包的时候加上--add-data把它们添加进去
4)使用了pyinstaller成功打包后,不再受限于本机环境。因为pyinstaller已经把依赖的python环境,依赖的第三方包,还有代码里面涉及到的资源都拷贝进到main.exe里面,也做了地址替换。
需要打包除.py之外的文件需要使用如下命令
pyinstaller -Fmain.py \
--add-data=${PARENT_DIR}/data/*.csv: data \
--add-data=${PARENT_DIR}/config/*.yaml:config l--add-data=${PARENT_DIR}/ readme : .
冒号和分号的使用
Linux系统使用冒号,Windows系统使用分号
最后的点是根目录
说明
S{PARENT_DIR}表示项目目录,或者直接替换成具体路径就行。比如--add-data=~/project/data/*.csv:data \。~/project代表你的项目目录。
--add-data可以写多个,“\”表示换行,防止命令放在一行过长
--add-data里面冒号之前的路径用绝对路径(该路径是目前你想拷贝进exe里面的这些文件当前是放在你机器上的具体那个目录);且可以使用通配符“*",方便你一次拷贝多个文件,当然也可以具体到文件。冒号之后用的是相对路径(相对的是生成exe之后,执行的时候发现老是提示在/tmp/xxxx下面No such file or directory,相对的就是这个/tmp/xxxx/,而且这个xxxx可能每次都不一样,它就是一个exe运行时候的临时目录)。
首先要理解--add-data=$(PARENT_DIRy/data/*.csv:data这句话的意思,它指的是把项目路径下的/data里面的所有csv文件拷贝到/tmp/xxxx/data目录里面,但是/tmp/xxxx不用你写。
在运行pyinstaller时候写的这个--add-data的作用跟你直接pyinstaller -F main.py啥都不加,往最后编译完生成的main.spec文件里面的,Analysis->data数组添加(源地址,目的地址)这种元组对的作用是一样的。不过我感觉还是直接用--add-data比较方便。
如果使用了以上代码,还报错,则可以考虑代码中的路径是否正确
代码中不能用相对路径
要使用绝对路径
示例
命令如下:
pyinstaller --add-data=F:/a-wp/wp/TestCase/test/*.jpg;. -i love.ico -F test.py -n love
代码里的地址
可以看到被注释掉的代码是错误的,后面改了新的写法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。