CentOS下運行Python程序

?在Linux虛擬機下運行爬蟲程序是非常硬的剛需。讓爬蟲在后臺運行可以節(jié)省本機資源,亦可以充分利用電腦不開機的時間。
?在使用爬蟲的過程中,依次遇到了這幾個問題:安裝python3.5、yum兼容性問題、SSH中斷時保持運行


  • 安裝python3.5

python3才是目前主流的python版本,因此安裝python3是必然的。我之前用的是3.5,所以選擇安裝python3.5,參考資料是這篇博客。
在安裝之前應該先把依賴項裝好,以免之后出奇怪的問題。

yum -y groupinstall "Development tools"
yum -y install openssl-devel sqlite-devel bzip2-devel ncurses-devel gdbm-devel readline-devel tcl-devel tk-devel xz-devel zlib-devel db4-devel libpcap-devel

?然后是從官方網(wǎng)站下載python的包并解壓。
?你可以自己使用mv指令把這個包扔到你喜歡的位置。

wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
tar -zxf /usr/local/src/Python-3.5.1.tgz

?這個包相當于未安裝的程序,我們還需要編譯和安裝。

# 具體要看你的包位置在哪
cd Python-3.5.1
./configure --prefix=/opt/python3.5 --enable-shared
make && make install

?在./config的過程中,可能會報錯。仔細看報錯信息,很可能是gcc報錯。
?這是因為沒有g(shù)cc的包,使用yum install gcc來獲取。
?值得注意的是CentOS的yum指令是需要python解釋器的,路徑是

 /usr/lib/python

?進入/usr/lib 路徑之后,可以通過指令ll python*查看文件和依賴關(guān)系。
?因此在你裝好python3.5之前,不要隨手刪了這個文件。你可以使用

mv python python.bak

?來替代rm -rf python的粗暴指令。
?這樣如果安裝過程中出現(xiàn)缺少包,需要使用yum指令,那你還有救。
?最后就是把python解釋器重新軟鏈接到python3.5上面

# /usr/python3.5/bin/python3 應當被改為你的python3路徑
ln -s /usr/python3.5/bin/python3 /usr/bin/python3
echo "/opt/python3.5/lib" > /etc/ld.so.conf.d/python3.5.conf

  • yum兼容性問題

現(xiàn)在解釋器是python3的版本了,但是有兩個系統(tǒng)應用用的還是python2的解釋器。它們分別是yumurlgrabber-ext-down。如果不做修改直接使用,就會報這樣的錯誤:

except OSError, e:
              ^

?所以我們要稍作修改,把文件頭部的#!/usr/bin/python改成
?#!/usr/bin/python2,這樣它們就知道該用哪個解釋器了。
?兩個文件路徑分別是

/usr/bin/yum
/usr/libexec/urlgrabber-ext-down

?用vi打開即可
?使用中還發(fā)現(xiàn)了兩個小問題,一個是tqdm庫不太好用,無法在同一行輸出。
?另一個是selenium使用的chromedriver要重新下載合適的版本。


  • SSH中斷時保持運行

通過SSH連接服務器之后,通常希望程序能一直保持運行狀態(tài)。這里就需要用到nohup&這兩個指令。
nohup作為一條指令的開頭,表示這條指令不會被HUP信號中斷。當你的SSH斷開時,服務器的程序會接到HUP信號,而nohup會忽略這個信號。
&作為一條指令的結(jié)尾,表示這條指令不會被INT信號中斷。有時我們會用ctrl+c來終止一條指令,這個時候就是發(fā)送了INT信號。
因此,如果希望程序后臺運行,且在SSH中斷后還能保持運行,可以使用

nohup python test.py &

除了后臺運行,還有一個問題是輸出。在控制臺監(jiān)控輸出當然好,但是如果是后臺運行呢?這就需要寫日志。
nohup指令默認會把所有的輸出都輸出到nohup.out文件中。當然,你可以指定輸出哪些內(nèi)容,也可以指定輸出到哪個文件夾。
nohup python test.py > nohup.log 可以讓你的輸出進入名為nohup.log的文件;python test.py 2>nohup.log可以在正常運行的基礎上,讓你的錯誤輸出進入nohup.log文件??吹竭@里應該對輸出有了大概的概念了。
事實上,真正起作用的是>指令。使用012分別代表STDIN(標準輸入)、STDOUT(標準輸出)、STDERR(標準錯誤輸出),使用>表示流的方向,輸出端使用&來區(qū)分標準流和文件。
因此,你可以使用2>&1表示錯誤信息會被重定向到標準輸出,使用&>a.log表示所有輸出都重定向到a.log
最后,一條常用的指令是

nohup command > myout.file 2>&1 &

先把標準輸出重定向到輸出文件,再把標準錯誤輸出重定向到標準輸出。亦即,輸出全部定向到輸出文件。而這條指令是后臺運行,不被crtl+c打斷,不被SSH中斷打斷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容