zoukankan      html  css  js  c++  java
  • Pyinstaller打包Selenium脚本为exe文件执行问题 litter

    由于同事辞职,许多运维工具的维护工作就交到我这里处理了,运维居然没人会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,介绍

  • 相关阅读:
    当Django模型迁移时,报No migrations to apply 问题时
    django--各个文件的含义
    django--创建项目
    1013. Battle Over Cities (25)
    1011. World Cup Betting (20)
    1009. Product of Polynomials (25)
    1007. Maximum Subsequence Sum (25)
    1006. Sign In and Sign Out (25)
    1008. Elevator (20)
    1004. Counting Leaves (30)
  • 原文地址:https://www.cnblogs.com/bencakes/p/5556572.html
Copyright © 2011-2022 走看看