欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python學(xué)習(xí)之subprocess模塊詳解

 更新時(shí)間:2024年12月07日 09:49:42   作者:aiyouweihei_001  
這篇文章主要介紹了python學(xué)習(xí)之subprocess模塊的相關(guān)資料,該模塊用于創(chuàng)建子進(jìn)程并與其進(jìn)行交互,它提供了多個(gè)函數(shù)和類來執(zhí)行操作系統(tǒng)命令、獲取命令輸出以及管理子進(jìn)程的生命周期,需要的朋友可以參考下

subprocess功能:創(chuàng)建子進(jìn)程,并連接他的輸入、輸出和錯(cuò)誤管道,獲取其返回狀態(tài)(可以在python代碼中執(zhí)行操作系統(tǒng)級(jí)別的命令)

1. subprocess.run()

功能:執(zhí)行args參數(shù)所表示的命令,等待命令結(jié)束,并返回一個(gè)CompletedProcess類型對(duì)象

1.1. 參數(shù)介紹

subprocess.run(args,*,stdin=None,input=None,stdout=None,stderr=None,shell=False,timeout=None,check=False,encoding=None,errors=None)

  • args:表示要執(zhí)行的命令,必須是字符串或字符串參數(shù)列表
  • Stdin, stdout, stderr:子進(jìn)程的標(biāo)準(zhǔn)輸入、輸出和錯(cuò)誤,其值可以是subprocess.PIPE, subporcess.DEVNULL, 一個(gè)已經(jīng)存在的文件描述符、已經(jīng)打開的文件對(duì)象或者None
  • timeout:設(shè)置命令超時(shí)時(shí)間,若超時(shí),子進(jìn)程將被殺死,并彈出TimeoutExpired異常
  • check:若該參數(shù)設(shè)為true,且進(jìn)程退出狀態(tài)碼不是0,則彈出CalledProcessError異常
  • encoding:若指定了該參數(shù),則stdin,stdout,stderr可以接收字符串?dāng)?shù)據(jù),并以該編碼方式編碼,否則只能接收bytes類型的數(shù)據(jù)
  • shell:若該參數(shù)為True,將通過操作系統(tǒng)的shell執(zhí)行指定命令

1.1.1 subprocess.CompletedProcess

run()的返回值,表示一個(gè)進(jìn)程結(jié)束了。CompletedProcess類有下面這些屬性

  • args:?jiǎn)?dòng)進(jìn)程的參數(shù),通常是一個(gè)列表或字符串
  • returncode:進(jìn)程結(jié)束狀態(tài)返回碼,0表示成功狀態(tài)
  • stdout:獲取子進(jìn)程的stdout,通常為bytes類型序列,None表示沒有捕獲值。
  • stderr:獲取子進(jìn)程的錯(cuò)誤信息,通常為bytes類型序列,None表示沒有捕獲值
  • check_returncode():檢查返回碼,若返回狀態(tài)碼不為0,彈出calledProcessError異常

1.1.2 subprocess.DEVNULL

特殊值,用于傳遞給stdout, stdin和stderr參數(shù)

1.1.3 subprocess.PIPE

管道,可傳遞給stdout, stdin, stderr參數(shù)

1.1.4 subprocess.STDOUT

特殊值,可傳遞給stderr參數(shù),表示stdout和stderr合并輸出,可以使用read(), readline(), readlines()等方法

1.1.5 args與shell

  • args參數(shù)可以接收一個(gè)字符串,也可以傳遞字符串分割列表
  • shell參數(shù)默認(rèn)為False,設(shè)置為True的時(shí)候表示使用操作系統(tǒng)的shell執(zhí)行命令,當(dāng)args為字符串時(shí),必須指定shell=True;當(dāng)args是個(gè)列表的時(shí)候,shell保持默認(rèn)的False

1.2. 獲取執(zhí)行結(jié)果

run()方法返回的是一個(gè)completedProcess類型對(duì)象,而非執(zhí)行結(jié)果。如果要獲取命令執(zhí)行的結(jié)果或信息,在調(diào)用run()方法的時(shí)候,需要指定stdout=sunprocess.PIPE,結(jié)果將會(huì)以bytes類型保存在stdout屬性中

1.2.1. 交互式輸入

run()方法的stdin參數(shù)可以接收一個(gè)文件句柄,如下

import subprocess
file=open("d:\\1.txt")
ret=subprocess.run('python',stdin=file,stdout=subprocess.PIPE,shell=True)
print(ret.stdout)

2. subprocess.Popen()

其用法和參數(shù)與run()基本類同,可創(chuàng)建和管理子進(jìn)程,但是它的返回值是一個(gè)Popen對(duì)象,而不是CompletedProcess對(duì)象

2.1 參數(shù)介紹

class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0,restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None)
  • args:shell命令,可以是字符串或者字符序列
  • bufsize:緩沖區(qū)大小,默認(rèn)-1,用于創(chuàng)建標(biāo)準(zhǔn)流的管道對(duì)象
    • 0:不使用緩沖區(qū)
    • 1:表示行緩沖,僅當(dāng)universal_newlines=True時(shí)可用,即文本模式
    • 正數(shù):表示緩沖區(qū)大小
    • 負(fù)數(shù):表示使用系統(tǒng)默認(rèn)的緩沖區(qū)大小。
  • stdin, stdout, stderr:分別表示程序的標(biāo)準(zhǔn)輸入、輸出、錯(cuò)誤句柄
  • preexec_fn:只在 Unix 平臺(tái)下有效,用于指定一個(gè)可執(zhí)行對(duì)象(callable object),它將在子進(jìn)程運(yùn)行之前被調(diào)用
  • shell:如果該參數(shù)為 True,將通過操作系統(tǒng)的 shell 執(zhí)行指定的命令。
  • cwd:用于設(shè)置子進(jìn)程的當(dāng)前目錄。
  • env:用于指定子進(jìn)程的環(huán)境變量。如果 env = None,子進(jìn)程的環(huán)境變量將從父進(jìn)程中繼承。

2.1.1 subprocess.Popen可調(diào)用的方法

  • poll():檢查進(jìn)程是否終止
  • wait():等待子進(jìn)程終止
  • communicate(input, timeout):和子進(jìn)程交互,發(fā)送和讀取數(shù)據(jù)
    • input的數(shù)據(jù)類型必須是字節(jié)串,若universal_newlines=True,則input參數(shù)的數(shù)據(jù)類型必須是字符串
    • 該方法返回一個(gè)元組(stdout_data, stderr_data),字節(jié)串或字符串
    • timeout指定的秒數(shù)后該進(jìn)程還沒結(jié)束,將會(huì)拋出TimeoutExpired異常
  • send_signal(signal):發(fā)送信號(hào)到子進(jìn)程
  • terminate():停止子進(jìn)程,即發(fā)送SIGTERM信號(hào)到子進(jìn)程
  • kill():殺死子進(jìn)程,發(fā)送SIGKILL

2.2 實(shí)例

Popen對(duì)象的stdin, stdout, stderr是三個(gè)文件句柄,可以像文件那樣讀寫,通過subprocess.stdin.write()可以輸入數(shù)據(jù),subprocess.Popen().stdout.read()可以輸出數(shù)據(jù)

import subprocess
s=subprocess.Popen('python3',stdout=subprocess.PIPE,stdin=subprocess.PIPE,shell=True)
s.stdin.write(b'import os\n')
s.stdin.write(b'print(os.environ)')
s.stdin.close()

3. subprocess常用函數(shù)

函數(shù)使用說明
subprocess.run()執(zhí)行args參數(shù)所表示的命令,執(zhí)行完成后返回CompletedProcess
subprocess.call()執(zhí)行指定的命令,返回命令執(zhí)行狀態(tài),類似os.system(cmd)
subprocess.check_call()等價(jià)于subprocess.run(…,check=True)
subprocess.check_output()執(zhí)行指定命令,狀態(tài)碼為0則返回命令執(zhí)行結(jié)果,否則拋出異常
subprocess.getoutput()接收字符串格式的命令,執(zhí)行并返回結(jié)果,類似于os.popen(cmd).read()和commands.getoutput(cmd)
subprocess.getstatusoutput()執(zhí)行cmd命令,返回元組(命令執(zhí)行狀態(tài),命令執(zhí)行結(jié)果輸出)

附:python subprocess.run() 執(zhí)行py腳本并等待該腳本執(zhí)行完成

要使用 subprocess.run() 執(zhí)行 Python 腳本并等待腳本執(zhí)行完成,可以按照以下方式進(jìn)行:

import subprocess

# 腳本的文件路徑
script_path = "/path/to/your/script.py"

# 使用 subprocess.run() 執(zhí)行腳本
subprocess.run(["python", script_path], capture_output=True, text=True)

# 程序會(huì)在這里等待腳本執(zhí)行完成

在上述代碼中:

  • "python" 是要執(zhí)行的命令。
  • [script_path] 是命令的參數(shù),即你要執(zhí)行的Python腳本的路徑。
  • capture_output=True 參數(shù)表示捕獲子進(jìn)程的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤流。返回的結(jié)果將會(huì)是一個(gè) CompletedProcess 對(duì)象,其 stdout 和 stderr 屬性分別包含標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤的內(nèi)容。
  • text=True 參數(shù)表示將捕獲的輸出以文本形式返回(在Python 3.7及以上版本有效)。

subprocess.run() 會(huì)阻塞當(dāng)前進(jìn)程,直到被調(diào)用的命令執(zhí)行完成。執(zhí)行完成后,程序才會(huì)繼續(xù)執(zhí)行后續(xù)的代碼。如果你不想捕獲輸出,可以去掉 capture_output 參數(shù)。

總結(jié) 

到此這篇關(guān)于python學(xué)習(xí)之subprocess模塊詳解的文章就介紹到這了,更多相關(guān)python之subprocess模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論