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

  用Selenium編寫的一個(gè)爬蟲(chóng)腳本cctv.py,需要給不懂軟件的人運(yùn)行。為了不讓他去搭建,安裝各種包,庫(kù),所以將腳本打包成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
  下載后我沒(méi)有測(cè)試過(guò),下載過(guò)程沒(méi)有報(bào)錯(cuò)OK,如果要測(cè)試是否成功,可以在網(wǎng)上搜索。
  三. 打包c(diǎn)ctv.py腳本
  zhuben@zb:~$ pyinstaller --onefile cctv.py
  運(yùn)行之后會(huì)看到很多打印信息。完成后會(huì)生成build和dist文件夾,cctv.spec文件
  生成的exe文件其實(shí)是根據(jù).spec文件中的內(nèi)容來(lái)生成的,可以打開(kāi)查看。
  如果已經(jīng)有了.spec文件,可以直接運(yùn)行
  zhuben@zb:~$ pyinstaller cctv.spec
  進(jìn)入dist文件夾會(huì)發(fā)現(xiàn)cctv.exe文件。如果想了解更多參數(shù),可以參考官方文檔
  運(yùn)行試試看
  如果出現(xiàn)IOError:/tmp/_MEISGj2tQ/selenium/webdriver/firefox/x86/x_ignore_nofocus.so之類的缺少文件錯(cuò)誤。那需要修改.spec文件
  原內(nèi)容為:
  a = Analysis(['main.py'],
  pathex=[...],
  binaries=None,
  datas=None,
  ...)
  要手動(dòng)將缺少的文件路徑加上去
  改為:
  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)容來(lái)自參考:Pyinstaller遇到的問(wèn)題
  解決之后,發(fā)現(xiàn)沒(méi)有出現(xiàn)Runtime問(wèn)題了,但是有WebDriverException:
  selenium.common.exceptions.WebDriverException: Message: The browser appears to have exited before we could connect.
  這是因?yàn)闆](méi)有顯示器的原因,所以需要xvfb搭建一個(gè)虛擬的環(huán)境。關(guān)于xvfb的更多內(nèi)容可以自行搜索
  四. 使用xvfb
  zhuben@zb:~$ Xvfb -ac :10 &
  zhuben@zb:~$ export DISPLAY=:10    #將顯示連接到xvfb所創(chuàng)建的環(huán)境
  再來(lái)運(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的啟動(dòng)/關(guān)閉命令加到了爬蟲(chóng)腳本中
  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中去。
  六.遇到的問(wèn)題
  1.Exec format error.Binary file not executable:
  文件格式錯(cuò)誤,確保你的exe文件是在你當(dāng)前的系統(tǒng)中生成的。雖然Pyinstaller是跨平臺(tái)的,但是他打包之后的exe文件并不能跨平臺(tái)執(zhí)行。也是說(shuō),在win下打包生成的exe文件只能在win下運(yùn)行;在linux下打包生成的exe文件,只能在linux下運(yùn)行。開(kāi)始并不知道這個(gè),總是在win下打包好后,傳到ubuntu下去運(yùn)行
  2.開(kāi)啟了xvfb,但是還是提示W(wǎng)ebDriverException:
  確保你的DISPLAY 的值和你xvfb設(shè)置的值是一致的。xvfb設(shè)置為:10, 那么你需要 export DISPLAY=:10?梢暂斎雃xport查看所有變量
  七. 其他
  可以看看Nuitka,介紹

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