使用python玩转linux

用python用惯了的人,就是很想用python封装每次需要操作的linux命令,然后达到只要修改一个py文件内部的内容,就把魔爪伸向整个模式的目的。不知道是不是一种理想主义。

搭建python环境

一般在机器上安装一个anaconda即可,有可能大概率机器上已经有安装好的anaconda了,不必重复安装。然后搭建一个自己的环境

环境配置(五)——Linux下 anaconda 安装与python环境配置_微知girl的博客-CSDN博客

1
conda create -n env_name python

其中env_name可以是你任何想要命名的环境名称,每次激活这个环境,可以保证你在激活环境的情况下安装的包和一些设置都是只针对你这个环境的,不会影响到其他人。

环境搭建好后,可以通过

1
2
3
4
5
6
7
# To activate this environment, use
#
# $ conda activate python37
#
# To deactivate an active environment, use
#
# $ conda deactivate

如果出现报错:

CommandNotFoundError: Your shell has not been properly 
configured to use 'conda activate'.
To initialize your shell, run
$ conda init <SHELL_NAME>

Anaconda使用conda activate激活环境出错(待完全解决)2018-06-09 - 简书

如果想要直接屏幕输入python命令:

1
2
3
4
5
conda activete python37
登陆信息前面出现(python37)
再直接输入python
就可以进入python环境,直接运行python命令
ctrl+D就可以退出python

使用python命令linux

python执行linux系统命令的几种方法(python3经典编程案例)_python执行linux命令_数据知道的博客-CSDN博客

OS

一个最简单的使用python执行linux命令的方式,就是引入os包:

1
2
import os
os.system('ls')

这个’ls’位置的内容,可以是任何你之前在linux中需要输入执行的命令。

但是换当前工作目录达不到(就是linux中的cd命令),那么如何换目录呢?

1
os.chdir('dir_name')

这里相对路径的书写,依旧要遵循linux中的规则,可能python中的一些语法也要被注意。

subprocess

python中 subprocess shell=False 与shell=True的区别_逍遥自在017的博客-CSDN博客

1
2
3
4
5
from subprocess import call  
cmd = "cat test.txt"
call(cmd, shell=True)
call("chmod +x test.sh",shell=True)
call("./test.sh",shell=True)

问题

以上好像都无法运行source命令,问题比较复杂,因为环境设置只是一次性的操作,就暂时先不纠结了。

1
source wrfenv.sh

我将wrf运行的环境变量都定义在里面了,看来每次只能打开shell的时候,手动source一下。

使用python运行wrf

一些常用包的准备

1
conda install -c conda-forge netcdf4

后台运行py程序的命令;nohup.out中显示不出来python程序中print的东西,这是因为python的输出有缓冲,导致nohup.out并不能够马上看到输出。

python 有个-u参数,使得python不启用缓冲。

1
nohup python -u main_cnopi.py>log_cnop.log 2>&1 &
1
nohup python -u main_random.py>log_d6.log 2>&1 &
1
nohup python -u pyrun_wrf2.py>log.log 2>&1 &

linux中如何利用Python来调用shell命令及其运行shell脚本_linux python 执行shell语句_GLL_的博客-CSDN博客

运行wps

将运行wps的命令封装在run_wps.sh文件中,但是因为目录地址都是相对的,需要先os.chdir将工作目录转换到wps目录下面:

1
2
3
4
5
6
7
import os
import subprocess
from subprocess import call

os.chdir('/public1/home/你个人路径/Build_WRF2/WPS-4.4')
call('chmod +x ./run_wps.sh',shell=True)
call('./run_wps.sh',shell=True)

run_wps.sh内命令如下:

1
2
3
4
5
6
7
8
9
#!/bin/bash
./geogrid.exe >& log.geogrid
echo 'geogrid done'
ln -sf ungrib/Variable_Tables/Vtable.ECMWF Vtable
./link_grib.csh /public1/home/..../Build_WRF/DATA/2013/*.grib
./ungrib.exe >& log.ungrib
echo 'ungrib done'
./metgrid.exe >& log.metgrid
echo 'metgrid done'

从外部修改namelist.wps文件内容

Linux下sed命令替换配置文件中某个变量的值(改变包含字符的一行的值)_sed替换变量的值_康雨城的博客-CSDN博客

linux sed 替换(整行替换,部分替换)、删除delete、新增add、选取 - 十年如一..bj - 博客园

1
sed -i 's/max_dom.*$/max_dom = 1,/g' namelist.wps

升级conda

1
conda install -c conda-forge wrf-python

安装wrf-python

1
conda install -c conda-forge wrf-python

Installation — wrf-python 1.3.4.1 documentation

~/anaconda3/envs/python37/bin/python

元服务器的使用

查看队列

1
bqueues

查看队列信息

1
bqueues -l 队列名

提交任务

1
bsub

命令提交作业时, ptile 指定数值越小,需要申请的节点就越多,作业越不容易得到调度, ptile 过小会造成资源和机时费的浪费。

1
2
3
4
5
6
7
8
#BSUB W 12:00
#BSUB n 48
#BSUB R span[ptile=24]
#BSUB q cpuII
#BSUB o OUTPUTFILE
#BSUB e ERRFILE
mpijob.MPITYPE
PROGRAM

提交任务是:

1
bsub < test.bsub # 注意这个小于号一定要有

查看任务情况

1
bjobs -a
1
bpeek <JOBID>  #查看作业的标准屏幕输出信息

PEND 作业正在队列中排队
RUN 作业正在被执行
DONE 作业已经执行完毕,并且正常退出
EXITED 作业非正常退出
PSUSP 作业在排队过程中被挂起
USUSP 作业在运行过程中被人为强制挂起
SSUSP 作业在运行过程中被系统挂起

挂起、释放和删除作业

1
bstop <JOBID>
1
bresume JOBID
1
2
3
4
5
6
7
8
9
bkill JOBID
bkill -u username 0 ## 杀死一个用户的所有任务
bkill -q cpuII 0 ## 杀死某个队列上提交的所有任务
bjobs -u 用户名 | grep USUSP|awk '{print $1}' |xargs bkill
## 杀死某种状态的任务
bjobs -w | grep lp37_t | awk '{print $1}' | xargs bkill
## 杀死任务名中有lp37_t的任务
btop JOBID
## 提高某个任务的优先级

一些python常用命令

m## 某个numpy

1
xpbest   = np.zeros((pN, dim)) # 创建数组
1
mask = np.expand_dims(mask,0).repeat(4,axis=0) # 增加维度
1
T2_mask_land = ma.masked_array(T2,mask = mask_land) # 添加掩码