首頁 >後端開發 >Python教學 >利用python3實作Linux的腳本功能

利用python3實作Linux的腳本功能

anonymity
anonymity轉載
2019-04-19 11:27:053998瀏覽

Python 3的更新已經有一段時間了,相比較於Python2也有許多不同的改變,Python 3 在Linux中也是利用比較多的,這裡主要實踐了一些Python3利用Linux的腳本執行指令。

首先,如果只需要執行,或只需要得到執行的狀態可以用 os.system 呼叫

#!/usr/bin/env python3
print ('hello,world')
import os
val2 =  os.system('cd trb && cd trb')
val3 = os.system('ls')
print('val2 is ',val2)

上述程式碼。如果val2內程式碼執行成功,即有兩級trb資料夾,則val2 的值是0  否則是256

兩行呼叫沒有繼承性,如果要連續執行就在一個語句裡加&& (Shell 語法)

在print之前,螢幕也會顯示執行的結果

hello,worldsh: line 0: cd: trb: 没有那个文件或目录
Abcd.py  automesh.sh  Cal_Ori  fold.txt  Linux_py_temp.py  meshedjob.rec  new_geom  onc143314  trb
val2 is  256

os.popen(cmd)方法,只能得到運行​​的輸出,但是如果不print螢幕上就什麼也沒有。

例如

val4 = os.popen('cd trb && cd trb')
val5 = os.popen('ls')print('开始PRINT')print(val4.read())print(val5.read())

顯示如下

hello,world
开始PRINT/bin/sh: line 0: cd: trb: 没有那个文件或目录
Abcd.py
automesh.shCal_Ori
fold.txt
Linux_py_temp.py
meshedjob.rec
new_geom
onc143314
trb

這裡輸出是類別檔案的對象,要呼叫read或readlines讀取也可以用來遍歷。

#終極武器,subprocess

py3.5後建議使用的模組subprocess

網路上教學裡的commands 是2裡的功能,在3裡被刪除,但是可以透過subprocess呼叫#有以下指令:##subprocess.#getstatusoutput
cmd 

#在shell中回傳執行<span class="pre">cmd<span class="pre">。 </span></span>(status, output) 傳回2個元素的元組

3.4之後加入win支援

#subprocess.getoutputcmd 

#執行cmd然後回傳結果

legacycmd = subprocess.getstatusoutput('ls -l')print('subprocess.getstatusoutput 输出',legacycmd)
legacycmd2 = subprocess.getoutput('ls -l')print('subprocess.getoutput 输出',legacycmd2)
上面為程式碼

輸出:

subprocess.getstatusoutput 输出 (0, &#39;总用量 48\n-rwxr--r-- 1 para036 bjpara  516 4月  16 2018 Abcd.py\n-rwxr--r-- 1 para036 bjpara 1619 4月  16 16:58                     automesh_onpsn_fortest.sh\n-rwxr--r-- 1 para036 bjpara 1616 4月  15 14:31 automesh.sh\ndrwxr-xr-x 5 para036 bjpara 4096 4月  15 14:31 Cal_Ori\n-rw-r                    --r-- 1 para036 bjpara   32 4月  16 16:56 fold.txt\n-rwxr--r-- 1 para036 bjpara 1530 4月  15 14:45 Linux_py_temp.py\n-rw-r--r-- 1 para036 bjpara   27                     4月  15 14:43 meshedjob.rec\ndrwxr-xr-x 2 para036 bjpara 4096 4月  15 14:31 new_geom\ndrwxr-xr-x 5 para036 bjpara 4096 4月  15 14:51 onc143314\ndrwx                    r-xr-x 5 para036 bjpara 4096 4月  16 17:05 onc16165650\ndrwxr-xr-x 5 para036 bjpara 4096 4月  16 16:46 onc163840\ndrwxr-xr-x 2 para036 bjpara 4096 4                    月  15 14:32 trb&#39;)
subprocess.getoutput 输出 总用量 48
-rwxr--r-- 1 para036 bjpara  516 4月  16 2018 Abcd.py
-rwxr--r-- 1 para036 bjpara 1619 4月  16 16:58 automesh_onpsn_fortest.sh
-rwxr--r-- 1 para036 bjpara 1616 4月  15 14:31 automesh.sh
drwxr-xr-x 5 para036 bjpara 4096 4月  15 14:31 Cal_Ori
-rw-r--r-- 1 para036 bjpara   32 4月  16 16:56 fold.txt
-rwxr--r-- 1 para036 bjpara 1530 4月  15 14:45 Linux_py_temp.py
-rw-r--r-- 1 para036 bjpara   27 4月  15 14:43 meshedjob.rec
drwxr-xr-x 2 para036 bjpara 4096 4月  15 14:31 new_geom
drwxr-xr-x 5 para036 bjpara 4096 4月  15 14:51 onc143314
drwxr-xr-x 5 para036 bjpara 4096 4月  16 17:05 onc16165650
drwxr-xr-x 5 para036 bjpara 4096 4月  16 16:46 onc163840
drwxr-xr-x 2 para036 bjpara 4096 4月  15 14:32 trb

  其中output是字串。如果不print就不顯示

新的版本推薦使用subprocess.run() 來解決一般問題。

subprocess.run()、subprocess.call()、subprocess.check_call()和subprocess.check_output()都是透過對subprocess.Popen的封裝來實現的高階函數,因此如果我們需要更複雜功能時,可以透過subprocess.Popen來完成

run預設不會回傳輸出,只傳回指令和執行狀態

recomd = subprocess.run(['ls','-l'])#等待命令执行完成后会在屏幕输出执行结果,然后返回一个包含执行结果的CompletedProcess类的实例。print('输出recmd\n',recomd)print(recomd.returncode)
輸出如下:

 如果要回傳輸出,要新增參數,傳遞subprocess.PIPE給stdout和stderr,然後可以透過傳回的CompletedProcess類別實例的stdout和stderr屬性或擷取對應的內容;

#universal_newlines:

 此參數影響的是輸入與輸出的資料格式,例如它的值預設為False,此時stdout和stderr的輸出是位元組序列;當該參數的值設為True時,stdout和stderr的輸出是字串。

總程式碼如下:

#!/usr/bin/env python3
print (&#39;hello,world&#39;)
import os
# val2 =  os.system(&#39;cd trb && cd trb&#39;)
# val3 = os.system(&#39;ls&#39;)
# print(&#39;val2 is &#39;,val2)
# val4 = os.popen(&#39;cd trb && cd trb&#39;)
# val5 = os.popen(&#39;ls&#39;)
# print(&#39;开始PRINT&#39;)
# print(val4.read())
# print(val5.read())
import subprocess
recomd = subprocess.run([&#39;ls&#39;,&#39;-l&#39;])
#等待命令执行完成后会在屏幕输出执行结果,然后返回一个包含执行结果的CompletedProcess类的实例。
print(&#39;输出recmd\n&#39;,recomd)
print(recomd.returncode)
print(&#39;传递参数&#39;)
recomdouterr = subprocess.run( [&#39;ls&#39;,&#39;-l&#39;],stdout=subprocess.PIPE,stderr=subprocess.PIPE,universal_newlines=True)
print(&#39;输出outerr&#39;,recomdouterr.stdout,recomdouterr.stderr)
print(&#39;传递参数2&#39;)
recomdouterr = subprocess.run( [&#39;ls&#39;,&#39;-l&#39;],stdout=subprocess.PIPE,universal_newlines=True)
print(&#39;输出outerr&#39;,recomdouterr.stdout)
print(len( recomdouterr.stdout.strip().split(&#39;\n&#39;) ))
print(recomdouterr.stdout.strip().split(&#39;\n&#39;)[-1])
# legacycmd = subprocess.getstatusoutput(&#39;ls -l&#39;)
#
# print(&#39;subprocess.getstatusoutput 输出&#39;,legacycmd)
#
# legacycmd2 = subprocess.getoutput(&#39;ls -l&#39;)
#
# print(&#39;subprocess.getoutput 输出&#39;,legacycmd2)

 參考資料:python3.5 官方文件: 

https://docs.python.org/3.5/library/subprocess.html

# # #####Python的使用途徑越來越廣泛了,而Linux作為伺服器端也是大有作為,使用Python來實現Linux的腳本操作,簡化了伺服器端的操作,提高了可控性。 ###

以上是利用python3實作Linux的腳本功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除