python3 調用 Linux 腳本

網上不少教程,不少都是說的2時代的。html

 

這裏把3實驗過的命令記錄下來python

 

首先,若是隻須要執行,或者只須要獲得執行的狀態能夠用 os.system 調用shell

 

#!/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  不然是256bash

兩行調用沒有繼承性,若是要連續執行就在一個語句里加 && (Shell 語法)函數

在print以前,屏幕還會顯示執行的結果spa

hello,world
sh: 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

#3d

 

os.popen(cmd)方法,只能獲得運行的輸出,可是若是不print屏幕上就什麼也沒有。code

例如htm

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.sh
Cal_Ori
fold.txt
Linux_py_temp.py
meshedjob.rec
new_geom
onc143314
trb

 

這裏輸出是類文件的對象,要調用read或者readlines讀取也能夠用來遍歷。

###

終極武器,subprocess

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

 

網上教程裏的commands 是2裏的功能,在3裏被刪除,可是能夠經過subprocess調用

有如下命令:

subprocess.getstatusoutputcmd 

在shell中返回執行cmd(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, '總用量 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')
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 ('hello,world')
#
import os
# val2 =  os.system('cd trb && cd trb')
# val3 = os.system('ls')
#
# print('val2 is ',val2)

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

import subprocess

recomd = subprocess.run(['ls','-l'])
#等待命令執行完成後會在屏幕輸出執行結果,而後返回一個包含執行結果的CompletedProcess類的實例。
print('輸出recmd\n',recomd)
print(recomd.returncode)

print('傳遞參數')
recomdouterr = subprocess.run( ['ls','-l'],stdout=subprocess.PIPE,stderr=subprocess.PIPE,universal_newlines=True)
print('輸出outerr',recomdouterr.stdout,recomdouterr.stderr)

print('傳遞參數2')

recomdouterr = subprocess.run( ['ls','-l'],stdout=subprocess.PIPE,universal_newlines=True)
print('輸出outerr',recomdouterr.stdout)
print(len( recomdouterr.stdout.strip().split('\n') ))
print(recomdouterr.stdout.strip().split('\n')[-1])

# legacycmd = subprocess.getstatusoutput('ls -l')
#
# print('subprocess.getstatusoutput 輸出',legacycmd)
#
# legacycmd2 = subprocess.getoutput('ls -l')
#
# print('subprocess.getoutput 輸出',legacycmd2)

  

 參考資料:python3.5 官方文檔 : https://docs.python.org/3.5/library/subprocess.html

                  cnblogs:https://www.cnblogs.com/yyds/p/7288916.html

相關文章
相關標籤/搜索