由於同事辭職,許多運維工具的維護工作就交到我這里處理了,運維居然沒人會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查看所有變量