您的位置:軟件測試 > 開源軟件測試 > 開源功能測試工具 > Selenium
Pyinstaller打包Selenium腳本為exe文件執(zhí)行問題
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2016/8/12 14:10:58 ] 推薦標(biāo)簽:Selenium 功能測試工具

  用Selenium編寫的一個爬蟲腳本cctv.py,需要給不懂軟件的人運(yùn)行。為了不讓他去搭建,安裝各種包,庫,所以將腳本打包成exe文件給他直接使用。
  運(yùn)行環(huán)境Ubuntu-16.04
  所需要的基本工具:
  1. Pyinstaller:打包工具
  2. xvfb: 虛擬顯示框架
  一. 安裝Pyinstaller
  注意:如果你要在Linux下運(yùn)行,那么在Linux下打包編譯。
  zhuben@zb:~$ pip install pyinstaller
  下載的是3.2版本。
  二. 安裝xvfb
  zhuben@zb:~$ sudo apt-get install xvfb
  下載后我沒有測試過,下載過程沒有報(bào)錯OK,如果要測試是否成功,可以在網(wǎng)上搜索。
  三. 打包c(diǎn)ctv.py腳本
  zhuben@zb:~$ pyinstaller --onefile cctv.py
  運(yùn)行之后會看到很多打印信息。完成后會生成build和dist文件夾,cctv.spec文件
  生成的exe文件其實(shí)是根據(jù).spec文件中的內(nèi)容來生成的,可以打開查看。
  如果已經(jīng)有了.spec文件,可以直接運(yùn)行
  zhuben@zb:~$ pyinstaller cctv.spec
  進(jìn)入dist文件夾會發(fā)現(xiàn)cctv.exe文件。如果想了解更多參數(shù),可以參考官方文檔
  運(yùn)行試試看
  如果出現(xiàn)IOError:/tmp/_MEISGj2tQ/selenium/webdriver/firefox/x86/x_ignore_nofocus.so之類的缺少文件錯誤。那需要修改.spec文件
  原內(nèi)容為:
  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')
  ],
  ...)
  以上路徑需要改為你自己機(jī)子上.so文件所在路徑
  內(nèi)容來自參考:Pyinstaller遇到的問題
  解決之后,發(fā)現(xiàn)沒有出現(xiàn)Runtime問題了,但是有WebDriverException:
  selenium.common.exceptions.WebDriverException: Message: The browser appears to have exited before we could connect.
  這是因?yàn)闆]有顯示器的原因,所以需要xvfb搭建一個虛擬的環(huán)境。關(guān)于xvfb的更多內(nèi)容可以自行搜索
  四. 使用xvfb
  zhuben@zb:~$ Xvfb -ac :10 &
  zhuben@zb:~$ export DISPLAY=:10    #將顯示連接到xvfb所創(chuàng)建的環(huán)境
  再來運(yùn)行cctv.exe,發(fā)現(xiàn)可以正常運(yùn)行了.
  或者執(zhí)行
  zhuben@zb:~$ xvfb-run --auto-servernum --server-args="-screen 0 1280x760x24"  ./cctv.exe
  五. 優(yōu)化
  如果每次需要運(yùn)行腳本的時(shí)候都加上這么多命令的話,很是不方便。所以,我將xvfb的啟動/關(guān)閉命令加到了爬蟲腳本中
  if __name__ == "__main__":
  os.system("nohup Xvfb -ac :10 &")
  main()
  os.system("sudo killall Xvfb")
  然后用sudo ./cctv.exe執(zhí)行
  但是這樣加上去是不能執(zhí)行的,原因是缺少了設(shè)置DISPLAY變量export DISPLAY=:10
  但是Python腳本中是加入不了export 命令的。原因參考:How to user export in Python on Linux
  所以:要么執(zhí)行sudo ./cctv.exe之前,執(zhí)行export DISPLAY=:10;要么將export DISPLAY=:10加入到.bashrc中去。
  六.遇到的問題
  1.Exec format error.Binary file not executable:
  文件格式錯誤,確保你的exe文件是在你當(dāng)前的系統(tǒng)中生成的。雖然Pyinstaller是跨平臺的,但是他打包之后的exe文件并不能跨平臺執(zhí)行。也是說,在win下打包生成的exe文件只能在win下運(yùn)行;在linux下打包生成的exe文件,只能在linux下運(yùn)行。開始并不知道這個,總是在win下打包好后,傳到ubuntu下去運(yùn)行
  2.開啟了xvfb,但是還是提示W(wǎng)ebDriverException:
  確保你的DISPLAY 的值和你xvfb設(shè)置的值是一致的。xvfb設(shè)置為:10, 那么你需要 export DISPLAY=:10?梢暂斎雃xport查看所有變量
  七. 其他
  可以看看Nuitka,介紹

軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd