Python在linux下批量执行指令
2018-07-17 本文已影响1人
Galory
今天在分析大鼠的DTI数据,其中有一步在linux下的指令时这样的,
flirt -in RAT5_b0 -ref RAT4_b0 -dof 12 -out RAT5to4 -omat RAT5to4.mat
在这个命令里,RAT5_b0是输入文件,每次都要变化;RAT4_b0是参考文件,在我的需要里这个是保持不变的;RAT5to4是输出文件,每次都要变化;RAT5to4.mat是生成的mat文件,也是每次都要重命名。
如果每次执行一次的话,就需要在电脑前等待,每次还要修改参数。
于是python就可以发挥了。
最开始想着是用linux下的shell脚本编写,但看了看shell的命令,与我而言还不如python方便,于是开始用python编写。
涉及到的知识点:
- 文件路径的读取
- 在windows下,我们复制路径的话一般是这样的,C:\Windows\System32,但是在python编写时我们要转换成python可以读取的名字,转换过来就是C:/Windows/System32,可以注意到就是把反斜杠符号转换为斜杠,这只是一种方式,还有好几种:
- path = r"C:\Windows\temp\readme.txt"
- path1 = r"c:\windows\temp\readme.txt"
- path2 = "c:\\windows\\temp\\readme.txt"
- path3 = "c:/windows/temp/readme.txt"
2.字符串的转换
3.python调用linux系统指令
- google了一下,python是可以调用linux系统指令的,只需要最开始import os,之后再用os.system(“cmd”)就可以,这里
- python调用linux系统指令时参数的传递
#单参数
param = 'a single param'
os.system("This is a %s" % (param))
#多参数
param1 = 'parameter1'
param2 = 'parameter2'
param3 ='parameter3'
#假设xxx.py运行需要三个参数
os.system("python xxx.py %s %s %s" %(param1,param2,param3))
最终的代码:
# 20180717 By galory Mail 996377370a@gmail.com
#This code is processing rat's DTI data
import os
#设置待处理数据的路径
path = "/brain/zhanjunzhang/Desktop/galory/processing/"
#读取path路径下的全部文件名
files = os.listdir(path)
# s= []
#cmd = os.system("flirt -in 101b0.gz -ref 104b0.gz -dof 12 -out 101to104 -omat 101to104.mat")
for file in files:
file1 = str(file)
#取文件名的前三个字符用于重命名
three_str = str(file1[0]+file1[1]+file1[2])
if file != '104b0.nii.gz':
# cmd
print (file)
#这里os.system()括号内的语句即最开始要在linux命令行输入的语句
os.system("flirt -in %s -ref 104b0.nii.gz -dof 12 -out %s/%sto104 -omat %s/%sto104.mat" %(file,path,three_str,path,three_str))
# os.system('ls')
# cmd = os.system("flirt -in 101b0.gz -ref 104b0.gz -dof 12 -out 101to104 -omat 101to104.mat")
# cmd = flirt -in 101b0.gz -ref 104b0.gz -dof 12 -out 101to104 -omat 101to104.mat
第一次认认真真写一个小的脚本简化任务,感觉很满足。先有一个需求,根据需求来想策略,最后一步一步有逻辑地写出来,遇到小问题一个一个解决,最终都会解决。