首頁 >後端開發 >Python教學 >python中subprocess批次執行linux指令

python中subprocess批次執行linux指令

不言
不言原創
2018-04-27 11:55:433404瀏覽

本篇文章給大家詳細講述了python中使用subprocess批量執行linux命令的方法,有興趣的朋友參考學習下。

可以執行shell指令的相關模組和函式有:

  • os.system

  • os.spawn

  • os.popen --廢棄

  • popen --廢棄

  • ##commands --廢棄,3. x中被移除

以上執行shell指令的相關的模組和函數的功能都在subprocess 模組中實現,並提供了更豐富的功能。

subprocess

call

執行指令,傳回狀態碼

>>> import subprocess
>>> ret = subprocess.call(["ls", "-l"], shell=False)
total 4684
-rw-r--r-- 1 root root   454 May 5 12:20 aa.py
-rw-r--r-- 1 root root    0 May 8 16:51 aa.txt
-rw-r--r-- 1 root root 4783286 Apr 11 16:39 DockerToolbox.exe
-rw-r--r-- 1 root root   422 May 5 12:20 ip_info.txt
-rw-r--r-- 1 root root   718 Apr 19 10:52 my.cnf
>>> ret = subprocess.call("ls -l", shell=True)
total 4684
-rw-r--r-- 1 root root   454 May 5 12:20 aa.py
-rw-r--r-- 1 root root    0 May 8 16:51 aa.txt
-rw-r--r-- 1 root root 4783286 Apr 11 16:39 DockerToolbox.exe
-rw-r--r-- 1 root root   422 May 5 12:20 ip_info.txt
-rw-r--r-- 1 root root   718 Apr 19 10:52 my.cnf
>>> print(ret)
0

check_call

#執行指令,如果執行狀態碼是0 ,則傳回0,否則拋例外值

#

>>> subprocess.check_call(["ls", "-l"])
total 4684
-rw-r--r-- 1 root root   454 May 5 12:20 aa.py
-rw-r--r-- 1 root root    0 May 8 16:51 aa.txt
-rw-r--r-- 1 root root 4783286 Apr 11 16:39 DockerToolbox.exe
-rw-r--r-- 1 root root   422 May 5 12:20 ip_info.txt
-rw-r--r-- 1 root root   718 Apr 19 10:52 my.cnf
0
>>> subprocess.check_call("exit 1", shell=True)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/local/python3.5/lib/python3.5/subprocess.py", line 581, in check_call
  raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command &#39;exit 1&#39; returned non-zero exit status 1

check_output

#執行指令,如果狀態碼是0 ,則傳回執行結果,否則拋異常

>>> subprocess.check_output(["echo", "Hello World!"])
b&#39;Hello World!\n&#39;
>>> subprocess.check_output("exit 1", shell=True)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/local/python3.5/lib/python3.5/subprocess.py", line 626, in check_output
  **kwargs).stdout
 File "/usr/local/python3.5/lib/python3.5/subprocess.py", line 708, in run
  output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command &#39;exit 1&#39; returned non-zero exit status 1

subprocess.Popen(...)

用於執行複雜的系統指令


參數:

args:shell指令,可以是字串或序列類型(如:list,元組)


bufsize:指定緩衝。 0 無緩衝,1 行緩衝,其他緩衝區大小,負值系統緩衝


stdin, stdout, stderr:分別表示程式的標準輸入、輸出、錯誤句柄


#preexec_fn:只在Unix平台下有效,用於指定一個可執行物件(callable object),它將在子程序運行之前被呼叫


close_sfs:在windows平台下,如果close_fds被設定為True,則新建立的子程序將不會繼承父程序的輸入、輸出、錯誤管道。


所以不能將close_fds設定為True同時重定向子程序的標準輸入、輸出與錯誤(stdin, stdout, stderr)。


shell:同上


cwd:用於設定子程序的目前目錄


env:​​用於指定子程序的環境變量。如果env = None,子程序的環境變數將從父進程中繼承。


universal_newlines:不同系統的換行符號不同,True -> 同意使用n


startupinfo與createionflags只在windows下有效


#將會傳遞給底層的CreateProcess()函數,用來設定子程序的一些屬性,如:主視窗的外觀,行程的優先權等等

執行普通指令

>>> import subprocess
>>> ret1 = subprocess.Popen(["mkdir","t1"])
>>> ret2 = subprocess.Popen("mkdir t2", shell=True)
>>> print(ret1)
<subprocess.Popen object at 0x7f4d7609dd30>
>>> print(ret2)
<subprocess.Popen object at 0x7f4d7609dc18>

終端機輸入的指令分為兩種:

  • #輸入即可輸出,如:ifconfig

輸入進行某一環境,依賴再輸入,如:python

#
>>> import subprocess
>>> obj = subprocess.Popen("mkdir t3", shell=True, cwd=&#39;/tmp/&#39;,)
>>> import subprocess
>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
>>> obj.stdin.write("print(1)\n")
9
>>> obj.stdin.write("print(2)")
8
>>> obj.stdin.close()
>>> cmd_out = obj.stdout.read()
>>> obj.stdout.close()
>>> cmd_error = obj.stderr.read()
>>> obj.stderr.close()
>>> print(cmd_out)
1
2
>>> print(cmd_error)

>>> import subprocess
>>> 
>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
>>> obj.stdin.write("print(1)\n")
9
>>> obj.stdin.write("print(2)")
8
>>> 
>>> out_error_list = obj.communicate()
>>> print(out_error_list)
(&#39;1\n2\n&#39;, &#39;&#39;)

#################### #######
>>> obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
>>> out_error_list = obj.communicate(&#39;print("hello")&#39;)
>>> print(out_error_list)
(&#39;hello\n&#39;, &#39;&#39;)
#########相關推薦:##########利用python執行shell腳本並動態傳​​參及subprocess基本使用######### ####subprocess 模組的介紹與使用############Python標準庫子程序subprocess套件的詳細介紹################### ############

以上是python中subprocess批次執行linux指令的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn