Python經(jīng)常被稱作“膠水語(yǔ)言”,因?yàn)樗軌蜉p易地操作其他程序,輕易地包裝使用其他語(yǔ)言編寫的庫(kù),也當(dāng)然可以用Python調(diào)用Shell命令。
用Python調(diào)用Shell命令有如下幾種方式:
1. os.system
os.system("The command you want"). |
|
os.system("lscpu"). |
|
os.system("ls -al"). |
這個(gè)調(diào)用相當(dāng)直接,且是同步進(jìn)行的,程序需要阻塞并等待返回。返回值是依賴于系統(tǒng)的,直接返回系統(tǒng)的調(diào)用返回值,所以windows和linux是不一樣的。
2. os.popen
os.popen(command[,mode[,bufsize]]) |
可以看出,popen方法通過(guò)p.read()獲取終端輸出,而且popen需要關(guān)閉close().當(dāng)執(zhí)行成功時(shí),close()不返回任何值,失敗時(shí),close()返回系統(tǒng)返回值. 可見(jiàn)它獲取返回值的方式和os.system不同。
3. 使用commands ( python3失效)
根據(jù)你需要的不同,commands模塊有三個(gè)方法可供選擇。getstatusoutput, getoutput, getstatus。
commands.getstatusoutput(cmd) 返回(status, output). |
|
commands.getoutput(cmd) 只返回輸出結(jié)果 |
|
commands.getstatus(file) 返回ls -ld file的執(zhí)行結(jié)果字符串,調(diào)用了getoutput,不建議使用此方法 |
但是,如上三個(gè)方法都不是Python推薦的方法,而且在Python3中其中兩個(gè)已經(jīng)消失。
4. subprocess《Python文檔中目前全力推薦》
subprocess使用起來(lái)同樣簡(jiǎn)單:
直接調(diào)用命令,返回值即是系統(tǒng)返回。shell=True表示命令最終在shell中運(yùn)行。Python文檔中出于安全考慮,不建議使用shell=True。建議使用Python庫(kù)來(lái)代替shell命令,或使用pipe的一些功能做一些轉(zhuǎn)義。官方的出發(fā)點(diǎn)是好的,不過(guò)真心麻煩了很多, so....
但是,我使用subprocess失敗了
>>> import subprocess |
|
>>> subprocess.call("cat %s |grep %s > %s " % ("/home/www/running/os-app-api/nohup.out","2019-10-28","~/nohup-2019-10-28.out")) |
|
Traceback (most recent call last): |
|
File "<stdin>", line 1, in <module> |
|
File "/usr/lib64/python3.6/subprocess.py", line 287, in call |
|
with Popen(*popenargs, **kwargs) as p: |
|
File "/usr/lib64/python3.6/subprocess.py", line 729, in __init__ |
|
restore_signals, start_new_session) |
|
File "/usr/lib64/python3.6/subprocess.py", line 1364, in _execute_child |
|
raise child_exception_type(errno_num, err_msg, err_filename) |
|
FileNotFoundError: [Errno 2] No such file or directory: 'cat /home/www/running/os-app-api/nohup.out |grep 2019-10-28 > ~/nohup-2019-10-28.out ': 'cat /home/www/running/os-app-api/nohup.out |grep 2019-10-28 > ~/nohup-2019-10-28.out ' |
但是,可以直接運(yùn)行在shell里面:
同樣的 我用os.system 去運(yùn)行,也確實(shí)產(chǎn)生了。
>>> import os |
|
>>> os.system("cat %s |grep %s > %s " % ("/home/www/running/os-app-api/nohup.out","2019-10-28","~/nohup-2019-10-28.out")) |
|
256 |
源碼研究:
這里面最為重要的幾個(gè)參數(shù)是:. |
|
args:要執(zhí)行的shell命令,或者是命令的列表; |
|
bufsize:緩沖區(qū)大??;。 |
|
stdin、stdout、stderr:表示程序的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出以及錯(cuò)誤輸出。 |
|
shell:是否直接執(zhí)行命令,如果設(shè)置為True就表示可以直接執(zhí)行; |
|
cwd:當(dāng)前的工作目錄; |
|
env:子進(jìn)程環(huán)境變量; |
subprocess模塊里面還有一項(xiàng)功能比較強(qiáng)大的支持在于可以直接使用標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出進(jìn)行進(jìn)程的數(shù)據(jù)通訊操作。
例如,在Python安裝完成之后都會(huì)存在有交互式的編程環(huán)境,那么本次將通過(guò)程序調(diào)用交互式編程環(huán)境直接操作python命令行,在python命令行中直接輸入程序。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-600339.html
def main(): |
|
subp_popen=subprocess.Popen("python.exe",stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE) |
|
subp_popen.stdin.write("print('subp_popen.stdin.write1')\n".encode()) |
|
subp_popen.stdin.write("print('subp_popen.stdin.write2')\n".encode()) |
|
subp_popen.stdin.write(("print('subp_popen.stdin.write3'+1)").encode()) |
|
subp_popen.stdin.close() |
|
cmd_out=subp_popen.stdout.read() |
|
subp_popen.stdout.close() |
|
print(cmd_out.decode()) |
|
cmd_err=subp_popen.stderr.read() |
|
subp_popen.stderr.close() |
|
print(cmd_err) |
|
if __name__ == '__main__': |
|
main() |
|
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-600339.html
到了這里,關(guān)于Python調(diào)用Shell命令 (python,shell 混合編程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!