Pyinstaller打包Selenium脚本为exe文件执行问题

发表于:2016-8-12 11:40

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:litter-chick    来源:51Testing软件测试网采编

  由于同事辞职,许多运维工具的维护工作就交到我这里处理了,运维居然没人会Python脚本!
  用Selenium编写的一个爬虫脚本cctv.py,需要给不懂软件的人运行。为了不让他去搭建,安装各种包,库,所以将脚本打包成exe文件给他直接使用。
  运行环境Ubuntu-16.04
  所需要的基本工具:
  1. Pyinstaller:打包工具
  2. xvfb: 虚拟显示框架
  一. 安装Pyinstaller
  注意:如果你要在Linux下运行,那么就在Linux下打包编译。
  zhuben@zb:~$ pip install pyinstaller
  下载的是3.2版本。
  二. 安装xvfb
  zhuben@zb:~$ sudo apt-get install xvfb
  下载后我没有测试过,下载过程没有报错就OK,如果要测试是否成功,可以在网上搜索。
  三. 打包cctv.py脚本
  zhuben@zb:~$ pyinstaller --onefile cctv.py
  运行之后会看到很多打印信息。完成后会生成build\和dist\文件夹,cctv.spec文件
  生成的exe文件其实是根据.spec文件中的内容来生成的,可以打开查看。
  如果已经有了.spec文件,就可以直接运行
  zhuben@zb:~$ pyinstaller cctv.spec
  进入dist\文件夹会发现cctv.exe文件。如果想了解更多参数,可以参考官方文档
  运行试试看
  如果出现IOError:/tmp/_MEISGj2tQ/selenium/webdriver/firefox/x86/x_ignore_nofocus.so之类的缺少文件错误。那就需要修改.spec文件
  原内容为:
  a = Analysis(['main.py'],
  pathex=[...],
  binaries=None,
  datas=None,
  ...)
  要手动将缺少的文件路径加上去
  改为:
  a = Analysis(['main.py'],
  pathex=[...],
  binaries=None,
  datas=[
  ('/usr/lib/python2.7/site-packages/selenium/webdriver/firefox/x86/x_ignore_nofocus.so', 'selenium/webdriver/firefox/x86'),
  ('/usr/lib/python2.7/site-packages/selenium/webdriver/firefox/amd64/x_ignore_nofocus.so', 'selenium/webdriver/firefox/amd64')
  ],
  ...)
  以上路径需要改为你自己机子上.so文件所在路径
  内容来自参考:Pyinstaller遇到的问题
  解决之后,发现没有出现Runtime问题了,但是有WebDriverException:
  selenium.common.exceptions.WebDriverException: Message: The browser appears to have exited before we could connect.
  这就是因为没有显示器的原因,所以需要xvfb搭建一个虚拟的环境。关于xvfb的更多内容可以自行搜索
  四. 使用xvfb
  zhuben@zb:~$ Xvfb -ac :10 &
  zhuben@zb:~$ export DISPLAY=:10    #将显示连接到xvfb所创建的环境
  再来运行cctv.exe,发现可以正常运行了.
  或者执行
  zhuben@zb:~$ xvfb-run --auto-servernum --server-args="-screen 0 1280x760x24"  ./cctv.exe
  五. 优化
  如果每次需要运行脚本的时候都加上这么多命令的话,很是不方便。所以,我就将xvfb的启动/关闭命令加到了爬虫脚本中
  if __name__ == "__main__":
  os.system("nohup Xvfb -ac :10 &")
  main()
  os.system("sudo killall Xvfb")
  然后用sudo ./cctv.exe执行
  但是这样加上去是不能执行的,原因就是缺少了设置DISPLAY变量export DISPLAY=:10
  但是Python脚本中是加入不了export 命令的。原因参考:How to user export in Python on Linux
  所以:要么执行sudo ./cctv.exe之前,执行export DISPLAY=:10;要么就将export DISPLAY=:10加入到.bashrc中去。
  六.遇到的问题
  1.Exec format error.Binary file not executable:
  文件格式错误,确保你的exe文件是在你当前的系统中生成的。虽然Pyinstaller是跨平台的,但是他打包之后的exe文件并不能跨平台执行。也就是说,在win下打包生成的exe文件只能在win下运行;在linux下打包生成的exe文件,只能在linux下运行。开始并不知道这个,总是在win下打包好后,传到ubuntu下去运行
  2.开启了xvfb,但是还是提示WebDriverException:
  确保你的DISPLAY 的值和你xvfb设置的值是一致的。xvfb设置为:10, 那么你就需要 export DISPLAY=:10。可以输入export查看所有变量
  七. 其他
  可以看看Nuitka,介绍
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号