其實應該搞清楚何時要用python寫腳本,何時用shell
例如對于系統(tǒng)操作的業(yè)務躁愿,我傾向于用shell awk sed 等系統(tǒng)自帶的工具袍睡,
像要跑業(yè)務创泄,跑任務艺玲,那可以考慮用python ,例如多線程任務鞠抑,excel 饭聚,pdf 報表任務等
使用Python的列表,字典和其他內置的數(shù)據(jù)結構可以減少shell腳本50%的代碼行量
python調用shell腳本和調用shell命令類似
python實現(xiàn)shell腳本功能有3種方式
1.使用os模塊中的函數(shù)來實現(xiàn)shell腳本中的命令搁拙,shell常用的那些命令在python中通常有對應而且同樣簡潔的寫法秒梳,再加上python的一些循環(huán)即可
os.system(command)
ls命令 :os.listdir(”/”)
cp命令:shutil.copy(src,dest) shutil.copytree(src,dst[,symlinks])
move命令:shutil.move(src,dst)
os.chdir(dirname)
把當前工作目錄切換到dirname下
os.getcwd()
返回當前的工作目錄路徑
os.chroot(dirname)
把dirname作為進程的根目錄。和*nix下的chroot命令類似
os.mkdir(path,[mode])
創(chuàng)建目錄感混。mode的意義參見os.chmod()端幼,默認是0777
os.system(cmd):
os.popen(cmd):
用 commands 模塊,這個是模塊不是方法
2.在python中使用os.system(cmd):命令調用已經寫好的shell腳本
#!/bin/sh
#1.sh
echo "hello world!!"
調用1.sh腳本
import os
status = os.system('sh ~/svnrepos/1.sh')
print status
print status>>8
subprocess模塊可以用來調用腳本也可以用來調用命令
調用腳本
subprocess.Popen(". xxx.sh", shell=True)
調用命令
subprocess.call(["ls", "-l"])
從Python 2.4開始弧满,Python引入subprocess模塊來管理子進程婆跑,以取代一些舊模塊的方法:如 os.system、os.spawn庭呜、os.popen滑进、popen2.犀忱、commands.不但可以調用外部的命令作為子進程,而且可以連接到子進程的input/output/error管道扶关,獲取相關的返回信息
如果你還被某些書籍引導使用os.system或者os.popen等模塊阴汇,現(xiàn)在是放棄它們的時候了,這個模塊會滿足你絕大多數(shù)的系統(tǒng)命令執(zhí)行节槐、執(zhí)行結果獲取和解析等需求搀庶。其中最有用的是call(執(zhí)行系統(tǒng)命令)、check_call(執(zhí)行結果不為0則拋出異常)铜异、check_output(最方便的獲取執(zhí)行的輸出的函數(shù))哥倔、Popen+PIPE(支持管道的多命令執(zhí)行)。
在程序中運行其他程序或shell
可以這樣寫
subprocess.Popen('腳本/shell', shell=True)
也可以這樣
subprocess.call('腳本/shell', shell=True)
兩者的區(qū)別是前者無阻塞,會和主程序并行運行,后者必須等待命令執(zhí)行完畢,如果想要前者編程阻塞可以這樣
s = subprocess.Popen('腳本/shell', shell=True)
s.wait()
retcode = subprocess.call(["ls", "-l"])
和shell中命令ls -a顯示結果一樣
shell=True時揍庄,如果args是字符串咆蒿,Popen直接調用系統(tǒng)的Shell來執(zhí)行args指定的程序,即./如果args是一個序列蚂子,則args的第一項是定義程序命令字符串沃测,其它項是調用系統(tǒng)Shell時的附加參數(shù)。