美文网首页
CentOS下运行Python程序

CentOS下运行Python程序

作者: 南风落 | 来源:发表于2018-10-27 13:47 被阅读957次

 在Linux虚拟机下运行爬虫程序是非常硬的刚需。让爬虫在后台运行可以节省本机资源,亦可以充分利用电脑不开机的时间。
 在使用爬虫的过程中,依次遇到了这几个问题:安装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

 然后是从官方网站下载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报错。
 这是因为没有gcc的包,使用yum install gcc来获取。
 值得注意的是CentOS的yum指令是需要python解释器的,路径是

 /usr/lib/python

 进入/usr/lib 路径之后,可以通过指令ll python*查看文件和依赖关系。
 因此在你装好python3.5之前,不要随手删了这个文件。你可以使用

mv python python.bak

 来替代rm -rf python的粗暴指令。
 这样如果安装过程中出现缺少包,需要使用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兼容性问题

现在解释器是python3的版本了,但是有两个系统应用用的还是python2的解释器。它们分别是yumurlgrabber-ext-down。如果不做修改直接使用,就会报这样的错误:

except OSError, e:
              ^

 所以我们要稍作修改,把文件头部的#!/usr/bin/python改成
#!/usr/bin/python2,这样它们就知道该用哪个解释器了。
 两个文件路径分别是

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

 用vi打开即可
 使用中还发现了两个小问题,一个是tqdm库不太好用,无法在同一行输出。
 另一个是selenium使用的chromedriver要重新下载合适的版本。


  • SSH中断时保持运行

通过SSH连接服务器之后,通常希望程序能一直保持运行状态。这里就需要用到nohup&这两个指令。
nohup作为一条指令的开头,表示这条指令不会被HUP信号中断。当你的SSH断开时,服务器的程序会接到HUP信号,而nohup会忽略这个信号。
&作为一条指令的结尾,表示这条指令不会被INT信号中断。有时我们会用ctrl+c来终止一条指令,这个时候就是发送了INT信号。
因此,如果希望程序后台运行,且在SSH中断后还能保持运行,可以使用

nohup python test.py &

除了后台运行,还有一个问题是输出。在控制台监控输出当然好,但是如果是后台运行呢?这就需要写日志。
nohup指令默认会把所有的输出都输出到nohup.out文件中。当然,你可以指定输出哪些内容,也可以指定输出到哪个文件夹。
nohup python test.py > nohup.log 可以让你的输出进入名为nohup.log的文件;python test.py 2>nohup.log可以在正常运行的基础上,让你的错误输出进入nohup.log文件。看到这里应该对输出有了大概的概念了。
事实上,真正起作用的是>指令。使用012分别代表STDIN(标准输入)、STDOUT(标准输出)、STDERR(标准错误输出),使用>表示流的方向,输出端使用&来区分标准流和文件。
因此,你可以使用2>&1表示错误信息会被重定向到标准输出,使用&>a.log表示所有输出都重定向到a.log
最后,一条常用的指令是

nohup command > myout.file 2>&1 &

先把标准输出重定向到输出文件,再把标准错误输出重定向到标准输出。亦即,输出全部定向到输出文件。而这条指令是后台运行,不被crtl+c打断,不被SSH中断打断。

相关文章

网友评论

      本文标题:CentOS下运行Python程序

      本文链接:https://www.haomeiwen.com/subject/lhartqtx.html