前段时间移植一个python项目到OpenWrt,踩了不少坑,总结一下希望帮到有需要的人,来看打包问题:

0x01

在OpenWrt 使用pip直接安装了pyinstaller,打包过程中出现文件缺失、文件错误的问题:

从githut/pyinstaller得知linux环境下使用pyinstaller需要ldd、objcopy、objdump支持,openwrt安装gcc即可自动安装binutils:

opkg update
opkg install gcc

github 传送门:https://github.com/pyinstaller/pyinstaller

0x02

继续打包,继续报错,错误信息如下:

root@mux:~/daemon# pyinstaller daemon.py
2230 INFO: PyInstaller: 3.2.1
2232 INFO: Python: 2.7.9
2240 INFO: Platform: Linux-3.18.29-mips-with-glibc2.0
2244 INFO: wrote /root/daemon/daemon.spec
2278 INFO: UPX is not available.
2294 INFO: Extending PYTHONPATH with paths
['/root/daemon', '/root/daemon']
2296 INFO: checking Analysis
2454 INFO: checking PYZ
2542 INFO: checking PKG
2556 INFO: Building because toc changed
2558 INFO: Building PKG (CArchive) out00-PKG.pkg
ldd: can't open cache '/etc/ld.so.cache'
2713 INFO: Building PKG (CArchive) out00-PKG.pkg completed successfully.
2785 INFO: Bootloader /usr/lib/python2.7/site-packages/PyInstaller/bootloader/Linux-32bit/run
2788 INFO: checking EXE
2790 INFO: Building EXE because out00-EXE.toc is non existent
2791 INFO: Building EXE from out00-EXE.toc
2795 INFO: Appending archive to ELF section in EXE /root/daemon/build/daemon/daemon
Traceback (most recent call last):File "/usr/bin/pyinstaller", line 9, in <module>load_entry_point('PyInstaller==3.2.1', 'console_scripts', 'pyinstaller')()File "/usr/lib/python2.7/site-packages/PyInstaller/__main__.py", line 90, in runrun_build(pyi_config, spec_file, **vars(args))File "/usr/lib/python2.7/site-packages/PyInstaller/__main__.py", line 46, in run_buildPyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)File "/usr/lib/python2.7/site-packages/PyInstaller/building/build_main.py", line 788, in mainbuild(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))File "/usr/lib/python2.7/site-packages/PyInstaller/building/build_main.py", line 734, in buildexec(text, spec_namespace)File "<string>", line 26, in <module>File "/usr/lib/python2.7/site-packages/PyInstaller/building/api.py", line 411, in __init__self.__postinit__()File "/usr/lib/python2.7/site-packages/PyInstaller/building/datastruct.py", line 161, in __postinit__self.assemble()File "/usr/lib/python2.7/site-packages/PyInstaller/building/api.py", line 563, in assembleself.name)File "/usr/lib/python2.7/site-packages/PyInstaller/compat.py", line 486, in exec_command_allstdout=subprocess.PIPE, stderr=subprocess.PIPE, **kwargs)File "/usr/lib/python2.7/subprocess.py", line 710, in __init__errread, errwrite)File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_childraise child_exception
OSError: [Errno 2] No such file or directory

继续填坑,根据github用户提示,打包出错原因是:使用pip安装的pyinstaller,已经预编译过bootloader。需要在Openwrt平台手动重新编译,再手动安装:

git clone https://github.com/pyinstaller/pyinstaller.git
cd pyinstaller && git checkout v3.1
cd bootloader
python ./waf distclean all --no-lsb
python waf configure --no-lsb build install

见 https://github.com/pyinstaller/pyinstaller/issues/2050#issuecomment-248525988

0x03

以为柳暗花明,猝不及防又一坑:

重编译bootloader过程中出现:无法识别gcc -m32

在源码wscript文件找到这个-m32,看注释描述:

        # This ensures proper compilation with 64bit gcc and 32bit Python# or vice versa or with manually choosen --target-arch.# Option -m32/-m64 has to be passed to cflags and linkflages.elif ctx.env.PYI_ARCH == '32bit':# It was reported that flag '-m32' does not work with gcc# on 32-bit arm Linux. So skip the -m32 flag.if not (machine() == 'arm' and is_linux):ctx.check_cc(ccflags='-m32', msg='Checking for flags -m32')ctx.env.append_value('CFLAGS', '-m32')ctx.env.append_value('LINKFLAGS', '-m32')# Set LARGE_ADDRESS_AWARE_FLAG to True.# On Windows this allows 32bit apps to use 4GB of memory and# not only 2GB.# TODO verify if this option being as default might cause any side effects.if is_win:ctx.env.append_value('LINKFLAGS', '-Wl,--large-address-aware')elif ctx.env.PYI_ARCH == '64bit':ctx.check_cc(ccflags='-m64', msg='Checking for flags -m64')ctx.env.append_value('CFLAGS', '-m64')ctx.env.append_value('LINKFLAGS', '-m64')
elif ctx.env.PYI_ARCH == '32bit':

pass掉就好了:

        # This ensures proper compilation with 64bit gcc and 32bit Python# or vice versa or with manually choosen --target-arch.# Option -m32/-m64 has to be passed to cflags and linkflages.elif ctx.env.PYI_ARCH == '32bit': pass# It was reported that flag '-m32' does not work with gcc# on 32-bit arm Linux. So skip the -m32 flag.# if not (machine() == None and machine() == 'arm' and is_linux):#    ctx.check_cc(ccflags='-m32', msg='Checking for flags -m32')#    ctx.env.append_value('CFLAGS', '-m32')#    ctx.env.append_value('LINKFLAGS', '-m32')# Set LARGE_ADDRESS_AWARE_FLAG to True.# On Windows this allows 32bit apps to use 4GB of memory and# not only 2GB.# TODO verify if this option being as default might cause any side effects.# if is_win:#    ctx.env.append_value('LINKFLAGS', '-Wl,--large-address-aware')elif ctx.env.PYI_ARCH == '64bit':ctx.check_cc(ccflags='-m64', msg='Checking for flags -m64')ctx.env.append_value('CFLAGS', '-m64')ctx.env.append_value('LINKFLAGS', '-m64')

修改完毕,继续编译bootloader,根据提示增加需要的头文件,即可通过编译

0x04

最后一步,回到顶层目录,手动安装pyinstaller:

python setup.py install

搞定,附上一个打包成功的截图:

总结:安装gcc-->修改bootloader的wscript文件-->编译-->安装

第一次写博客,希望能帮助到有需要的童鞋 :)

OpenWrt MT7621使用pyinstaller打包失败解决办法相关推荐

  1. 【apktool正确打包流程】Apktool 打包失败解决办法【解包时必须带上-r参数,表示不解码资源文件】因为资源文件的接码会导致各种问题???

    Apktool 打包失败解决办法_Jasonzhiying的博客-CSDN博客 错误提示:brut.androlib.AndrolibException: brut.common.BrutExcept ...

  2. 苹果4S手机IOS6.1.3系统《微信6.2》登录失败解决办法!100%成功!小白也会用!

             苹果4S手机IOS6.1.3系统<微信6.2>登录失败解决办法!100%成功!小白也会用! 首先我要鄙视那些正在IOS6.1.3上使用微信,而又不分享成功方法的人,自己悄 ...

  3. idea验证失败_SVN提示https证书验证失败解决办法

    技术分享之 <SVN提示https证书验证失败解决办法>--我要编程技术手册系列 svn提交代码时报错,证书认证失败 Commit failed with error 0 files co ...

  4. android 生成泛型对象,java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法...

    ####问题描述 * java 解析多层含有泛型对象的json数据获取不到泛型类型 * 如果将泛型改成实际的类型就能正常解析 * 如果不改成实际的类型泛型数据被解析成com.google.gson.i ...

  5. shiro框架,自定义realm注入service失败解决办法

    shiro框架,自定义realm注入service失败解决办法 报错如下: org.springframework.beans.factory.BeanCreationException: Error ...

  6. 在ASP.net中的UpdatePanel,弹窗失败解决办法

    原文:在ASP.net中的UpdatePanel,弹窗失败解决办法 最开始我用: Response.Write("<script>alert('和哈呵呵呵呵呵呵!')</s ...

  7. 异常详细信息: System.Data.SqlClient.SqlException:用户 ‘IIS APPPOOL\DefaultAppPool‘ 登录失败解决办法

    异常详细信息: System.Data.SqlClient.SqlException:用户 'IIS APPPOOL\DefaultAppPool' 登录失败解决办法 参考文章: (1)异常详细信息: ...

  8. php微信公众号测试号token配置失败,微信公众号Token配置失败解决办法

    前言 今天生病在家,由于我的微信公众号被投诉了,因此影视站接口被迫关闭,于是就想着给大家分享 APP,于是就用了下微信的自动回复, 想着能否把这个自动回复对接到 MIPCMS 上,于是就开干.但是微信 ...

  9. lol手游日服服务器未响应,LOL手游进不去怎么回事?日服登陆失败解决办法[多图]...

    LOL手游进不去怎么回事?今日玩家大部分都在研究日服到底该怎样进入,但顺利进入的玩家却只有一小部分,剩下的玩家大多都在登录界面卡主了,而且最主要的还是不清楚该怎样去处理才能摆平这种现状.下面就为大家带 ...

  10. 第五人格获取服务器信息失败,第五人格获取版本信息失败怎么办 获取版本信息失败解决办法[图]...

    第五人格获取版本信息失败怎么办?有很多玩家遇到了这个问题,主要是游戏需要进行更新检查,获取失败就不能保证当前的游戏版本是最新的,就不能进入游戏,下面小编带来了解决办法! 获取版本信息失败解决办法: 1 ...

最新文章

  1. hdu1287 破译密码
  2. SQL AVG() 函数
  3. 万字长文+思维导图帮你梳理 Java IO 流,还学不会你来打我(值得收藏)
  4. 2个维度5大方法,让你的微服务在K8s上跑起来
  5. 常见类 --Object
  6. Linux 下删除非空目录
  7. oracle判断数字为复数,oracle学习笔记(十二) 查询练习(二) 高级查询
  8. java cms文章管理_孔浩java cms完整视频教程_爱分享666
  9. DM数据库查询错误码
  10. 统计学计算机app,统计学计算器
  11. 计算机硬件测试流程,驱动精灵如何检测电脑硬件 检测硬件看完你就懂了
  12. 恐龙为何不发明计算机,为什么恐龙没有产生智慧文明,而人类文明反而如此发达?...
  13. Auto CAD:将CAD三维实体转为三视工程图(俯视图、正视图、左视图)的图文教程之详细攻略(建议收藏!!)
  14. 手把手教你玩转 Gitea|使用 Helm 在 K3s 上安装 Gitea
  15. python语言是网络编程语言吗_三大主流编程语言Python为啥这么牛?
  16. 全网首款能模拟苹果IOS系统自带Safari浏览器的工具来了
  17. Estimator::relativePose
  18. FireFox安装广告净化器或其他三方插件
  19. dell服务器 指示灯_DELL服务器面板指示灯错误代码
  20. linux 查看文件目录

热门文章

  1. 如何使用Navicat将psc备份导入到MySQL
  2. 手把手教你批量下载微博视频
  3. vn.py2-行情记录的使用
  4. halt、poweroff
  5. 管理感悟:一种招聘考试的想法
  6. 360抢票 网站维护中 你的登录被踢了!
  7. 2019.9.15训练总结
  8. 中国高校计算机大赛英语cccc,通知-CCCC中国高校计算机大赛.PDF
  9. Python爬取哔哩哔哩视频
  10. 瑞星发布可防未知勒索病毒工具 将逐月公布更多漏洞