最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python?subprocess.run()、subprocess.Popen()、subprocess.check_output()

 更新時(shí)間:2024年02月22日 09:55:40   作者:Dontla  
Python的subprocess模塊是用于創(chuàng)建和管理子進(jìn)程的模塊,本文主要介紹了python?subprocess.run()、subprocess.Popen()、subprocess.check_output(),具有一定的參考價(jià)值,感興趣的可以了解一下

Python的subprocess模塊是用于創(chuàng)建和管理子進(jìn)程的模塊。它提供了一種在Python中調(diào)用外部命令的方式,可以執(zhí)行系統(tǒng)命令、啟動(dòng)新的進(jìn)程、連接到子進(jìn)程的輸入/輸出管道等。

基本函數(shù)

subprocess.run

subprocess.run(args, *, stdin=None, input=None, stdout=None,
               stderr=None, capture_output=False, text=None,
               check=False, timeout=None, encoding=None, errors=None)
  • 運(yùn)行指定的命令,并等待其完成。args參數(shù)是一個(gè)字符串或列表,表示要執(zhí)行的命令和參數(shù)。
  • stdin、stdout和stderr參數(shù)分別用于指定子進(jìn)程的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出的處理方式。
  • capture_output參數(shù)用于指定是否捕獲子進(jìn)程的輸出。
  • check參數(shù)用于指定是否檢查子進(jìn)程的返回值,如果返回值不為0,則會(huì)拋出CalledProcessError異常。
  • timeout參數(shù)用于指定子進(jìn)程的超時(shí)時(shí)間。
  • encoding和errors參數(shù)用于指定輸入/輸出的編碼方式和錯(cuò)誤處理方式。

示例(只可以捕獲標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤不知道咋獲取,異常也沒(méi)拋。。。以后再看,現(xiàn)在有事)

import subprocess


def execute_update_ip_sh(ip):
    """
    執(zhí)行修改配置文件 ip 腳本,將會(huì)修改ky_ai_solution.json、nginx.conf、vsftpd.conf 等文件中的ip
    """
    try:
        # 構(gòu)建命令
        command = ['/ky/update_ip.sh', ip]

        # 執(zhí)行命令并獲取輸出(這個(gè)出錯(cuò)直接就拋異常了,不能捕獲標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤)
        # result = subprocess.check_output(command, universal_newlines=True)

        result = subprocess.run(command, stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE, universal_newlines=True)

        # 打印腳本的輸出
        print(f"[{command}] 標(biāo)準(zhǔn)輸出:", result.stdout)

        # 打印腳本的錯(cuò)誤輸出(打印不出來(lái))
        print(f"[{command}] 標(biāo)準(zhǔn)錯(cuò)誤輸出:", result.stderr)

        # 執(zhí)行成功,返回True
        return result.returncode == 0
    # except subprocess.CalledProcessError as e:
    except Exception as e:
        # 執(zhí)行失敗,返回False
        print(e)
        print("ddddddddddddddddddddddddddddddddddddddd")
        return False


if __name__ == "__main__":
    execute_update_ip_sh("192.168.1.140")

在這里插入圖片描述

subprocess.Popen

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)
  • 啟動(dòng)一個(gè)新的進(jìn)程,并返回一個(gè)Popen對(duì)象,可以用于與子進(jìn)程進(jìn)行交互。
  • args參數(shù)和其他參數(shù)的含義與subprocess.run()函數(shù)相同。

subprocess.Popen參數(shù)解釋

  • args:要執(zhí)行的命令及其參數(shù)??梢允且粋€(gè)字符串或一個(gè)字符串列表。
  • bufsize:指定緩沖區(qū)的大小。默認(rèn)值為-1,表示使用系統(tǒng)默認(rèn)的緩沖區(qū)大小。
  • executable:指定要執(zhí)行的可執(zhí)行文件的路徑。默認(rèn)值為None,表示使用系統(tǒng)默認(rèn)的可執(zhí)行文件。
  • stdin:指定子進(jìn)程的標(biāo)準(zhǔn)輸入??梢允且粋€(gè)文件對(duì)象或一個(gè)文件描述符。默認(rèn)值為None,表示使用父進(jìn)程的標(biāo)準(zhǔn)輸入。
  • stdout:指定子進(jìn)程的標(biāo)準(zhǔn)輸出??梢允且粋€(gè)文件對(duì)象或一個(gè)文件描述符。默認(rèn)值為None,表示使用父進(jìn)程的標(biāo)準(zhǔn)輸出。
  • stderr:指定子進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤輸出??梢允且粋€(gè)文件對(duì)象或一個(gè)文件描述符。默認(rèn)值為None,表示使用父進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤輸出。
  • preexec_fn:在子進(jìn)程執(zhí)行前調(diào)用的可調(diào)用對(duì)象。默認(rèn)值為None,表示不調(diào)用任何函數(shù)。

示例:使用preexec_fn來(lái)將Popen對(duì)象綁定進(jìn)程組

當(dāng)使用shell=True時(shí),subprocess.Popen()函數(shù)創(chuàng)建的子進(jìn)程實(shí)際上是一個(gè)shell進(jìn)程,而不是直接執(zhí)行的命令。因此,向Popen對(duì)象發(fā)送信號(hào)并不能直接影響到子進(jìn)程。

如果需要向通過(guò)shell執(zhí)行的命令發(fā)送信號(hào),可以使用os.killpg()函數(shù)來(lái)發(fā)送信號(hào)給進(jìn)程組。具體步驟如下:

  • 創(chuàng)建Popen對(duì)象時(shí),設(shè)置preexec_fn=os.setsid,以創(chuàng)建一個(gè)新的進(jìn)程組。
  • 使用os.killpg()函數(shù)發(fā)送信號(hào)給進(jìn)程組。

下面是一個(gè)示例,演示了如何向通過(guò)shell執(zhí)行的命令發(fā)送信號(hào):

import subprocess
import os
import signal

# 通過(guò)shell執(zhí)行命令
process = subprocess.Popen('sleep 10', shell=True, preexec_fn=os.setsid)

# 發(fā)送信號(hào)給進(jìn)程組
os.killpg(os.getpgid(process.pid), signal.SIGTERM)

在這個(gè)示例中,首先通過(guò)subprocess.Popen()函數(shù)創(chuàng)建了一個(gè)通過(guò)shell執(zhí)行的命令。在創(chuàng)建Popen對(duì)象時(shí),通過(guò)preexec_fn=os.setsid設(shè)置了preexec_fn參數(shù),以創(chuàng)建一個(gè)新的進(jìn)程組。

然后,使用os.killpg()函數(shù)發(fā)送信號(hào)給進(jìn)程組。在這個(gè)示例中,發(fā)送了SIGTERM信號(hào),即終止信號(hào)。

需要注意的是,向進(jìn)程組發(fā)送信號(hào)會(huì)影響到進(jìn)程組中的所有進(jìn)程。因此,如果有多個(gè)通過(guò)shell執(zhí)行的命令,它們都屬于同一個(gè)進(jìn)程組,發(fā)送信號(hào)時(shí)需要注意。

  • close_fds:指定是否在子進(jìn)程中關(guān)閉父進(jìn)程中打開(kāi)的文件描述符。默認(rèn)值為T(mén)rue,表示關(guān)閉文件描述符。
  • shell:指定是否通過(guò)shell來(lái)執(zhí)行命令。默認(rèn)值為False,表示不通過(guò)shell執(zhí)行命令。

當(dāng)shell參數(shù)設(shè)置為True時(shí),表示通過(guò)shell來(lái)執(zhí)行命令。這意味著可以使用shell的語(yǔ)法和功能,比如管道、重定向、通配符等。在這種情況下,args參數(shù)可以是一個(gè)字符串,表示要執(zhí)行的完整命令。

當(dāng)shell參數(shù)設(shè)置為False時(shí),表示不通過(guò)shell來(lái)執(zhí)行命令。這是默認(rèn)的行為。在這種情況下,args參數(shù)應(yīng)該是一個(gè)字符串列表,其中第一個(gè)元素是要執(zhí)行的命令,后續(xù)元素是命令的參數(shù)。

需要注意的是,使用shell=True時(shí),應(yīng)該謹(jǐn)慎處理輸入?yún)?shù),避免命令注入等安全問(wèn)題。應(yīng)該始終對(duì)用戶輸入進(jìn)行驗(yàn)證和過(guò)濾,避免直接將用戶輸入拼接到命令中。

下面是一個(gè)示例,演示了shell參數(shù)的用法:

import subprocess

# 通過(guò)shell執(zhí)行命令
subprocess.Popen('ls -l', shell=True)

# 不通過(guò)shell執(zhí)行命令
subprocess.Popen(['ls', '-l'])

在這個(gè)示例中,第一個(gè)Popen()函數(shù)調(diào)用通過(guò)shell執(zhí)行了ls -l命令,而第二個(gè)Popen()函數(shù)調(diào)用不通過(guò)shell執(zhí)行了ls -l命令。

使用shell執(zhí)行和不使用shell執(zhí)行的差異(以管道為例)

使用shell執(zhí)行:

下面是一個(gè)示例,演示了如何通過(guò)shell執(zhí)行命令并使用管道:

import subprocess

# 通過(guò)shell執(zhí)行命令并使用管道
process = subprocess.Popen('ls -l | grep .txt', shell=True)

# 等待子進(jìn)程結(jié)束
process.wait()

在這個(gè)示例中,通過(guò)subprocess.Popen()函數(shù)的shell參數(shù)設(shè)置為True,表示通過(guò)shell執(zhí)行命令。然后,可以使用shell的管道語(yǔ)法|將兩個(gè)命令連接起來(lái),實(shí)現(xiàn)輸出過(guò)濾。

不使用shell執(zhí)行:

import subprocess

# 不通過(guò)shell執(zhí)行命令并使用管道
command1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
command2 = subprocess.Popen(['grep', '.txt'], stdin=command1.stdout, stdout=subprocess.PIPE)

# 獲取命令2的輸出
output = command2.communicate()[0]

# 打印輸出結(jié)果
print(output.decode())

在這個(gè)示例中,首先創(chuàng)建了兩個(gè)Popen()對(duì)象,分別對(duì)應(yīng)兩個(gè)命令。command1執(zhí)行了ls -l命令,并將輸出通過(guò)管道傳遞給command2。command2執(zhí)行了grep .txt命令,并將結(jié)果輸出到標(biāo)準(zhǔn)輸出。

通過(guò)command2.communicate()方法獲取命令2的輸出,并將其打印出來(lái)。

不通過(guò)shell執(zhí)行命令時(shí),需要手動(dòng)設(shè)置命令之間的輸入輸出關(guān)系,以及處理命令的輸出。這需要更多的代碼來(lái)實(shí)現(xiàn),但也提供了更多的靈活性和控制能力。

  • cwd:指定子進(jìn)程的當(dāng)前工作目錄。默認(rèn)值為None,表示使用父進(jìn)程的當(dāng)前工作目錄。

  • env:指定子進(jìn)程的環(huán)境變量??梢允且粋€(gè)字典,表示環(huán)境變量的鍵值對(duì)。默認(rèn)值為None,表示使用父進(jìn)程的環(huán)境變量。

  • universal_newlines:指定是否將輸入/輸出流以文本模式打開(kāi)。默認(rèn)值為False,表示以二進(jìn)制模式打開(kāi)。

  • startupinfo:指定子進(jìn)程的啟動(dòng)信息??梢允且粋€(gè)subprocess.STARTUPINFO對(duì)象,用于設(shè)置子進(jìn)程的一些屬性。默認(rèn)值為None。

  • creationflags:指定子進(jìn)程的創(chuàng)建標(biāo)志。默認(rèn)值為0,表示使用默認(rèn)的創(chuàng)建標(biāo)志。

  • restore_signals:指定是否在子進(jìn)程中恢復(fù)信號(hào)處理程序。默認(rèn)值為T(mén)rue,表示恢復(fù)信號(hào)處理程序。

  • start_new_session:指定是否在新的會(huì)話中啟動(dòng)子進(jìn)程。默認(rèn)值為False,表示在當(dāng)前會(huì)話中啟動(dòng)子進(jìn)程。

  • pass_fds:指定要傳遞給子進(jìn)程的文件描述符列表。默認(rèn)值為(),表示不傳遞文件描述符。

  • encoding:指定輸入/輸出的編碼方式。默認(rèn)值為None,表示使用系統(tǒng)默認(rèn)的編碼方式。

  • errors:指定輸入/輸出的錯(cuò)誤處理方式。默認(rèn)值為None,表示使用系統(tǒng)默認(rèn)的錯(cuò)誤處理方式。

總結(jié)

subprocess.Popen()函數(shù)會(huì)返回一個(gè)Popen對(duì)象,可以用于與子進(jìn)程進(jìn)行交互。Popen對(duì)象具有一些常用的方法和屬性,比如communicate()、wait()、poll()、terminate()、kill()、stdout、stderrreturncode等。

Popen對(duì)象的常用方法和屬性

  • communicate(input=None, timeout=None):與子進(jìn)程進(jìn)行交互,發(fā)送輸入并獲取輸出。
  • wait():等待子進(jìn)程結(jié)束,并返回其返回值。
  • poll():檢查子進(jìn)程是否結(jié)束,如果結(jié)束則返回其返回值,否則返回None。
  • terminate():終止子進(jìn)程。
  • kill():殺死子進(jìn)程。
  • stdout:子進(jìn)程的標(biāo)準(zhǔn)輸出。
  • stderr:子進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤輸出。
  • returncode:子進(jìn)程的返回值。

下面是一個(gè)使用subprocess模塊的示例,演示了如何執(zhí)行一個(gè)系統(tǒng)命令并獲取其輸出:

import subprocess

# 執(zhí)行系統(tǒng)命令
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)

# 獲取命令的輸出
output = result.stdout
print(output)

以上代碼會(huì)執(zhí)行ls -l命令,并將其輸出打印出來(lái)。

需要注意的是,subprocess模塊在執(zhí)行外部命令時(shí),存在一定的安全風(fēng)險(xiǎn),特別是在使用shell=True參數(shù)時(shí)。因此,在使用subprocess模塊時(shí),應(yīng)該謹(jǐn)慎處理輸入?yún)?shù),避免命令注入等安全問(wèn)題。

subprocess.check_output

subprocess.check_output函數(shù)是Python標(biāo)準(zhǔn)庫(kù)subprocess模塊中的一個(gè)函數(shù),用于執(zhí)行系統(tǒng)命令并返回命令的輸出結(jié)果。

它的用法是:

subprocess.check_output(args, *, stdin=None, stderr=None, 
                        shell=False, universal_newlines=False)

其中,args是一個(gè)字符串或者字符串列表,表示要執(zhí)行的命令及其參數(shù)。stdin、stderr、shelluniversal_newlines是可選參數(shù),用于控制輸入、錯(cuò)誤輸出、是否使用shell以及輸出結(jié)果的編碼方式。

check_output函數(shù)會(huì)執(zhí)行指定的命令,并等待命令執(zhí)行完成。如果命令執(zhí)行成功,它會(huì)返回命令的輸出結(jié)果(以字節(jié)字符串的形式),如果命令執(zhí)行失敗,它會(huì)拋出一個(gè)CalledProcessError異常。

在上述代碼中,subprocess.check_output函數(shù)被用于執(zhí)行一些系統(tǒng)命令,如ip addr showip route show,以獲取當(dāng)前以太網(wǎng)接口的IP配置信息。

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

相關(guān)文章

  • python使用opencv進(jìn)行人臉識(shí)別

    python使用opencv進(jìn)行人臉識(shí)別

    本文主要介紹了python使用opencv進(jìn)行人臉識(shí)別的相關(guān)資料。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • Python庫(kù)functools示例詳解

    Python庫(kù)functools示例詳解

    Python?的?functools?模塊提供了一些常用的高階函數(shù),也就是用于處理其它函數(shù)的特殊函數(shù)。換言之,就是能使用該模塊對(duì)?所有可調(diào)用對(duì)象(?即?參數(shù)?或(和)?返回值?為其他函數(shù)的函數(shù)?)?進(jìn)行處理,這篇文章主要介紹了Python庫(kù)functools詳解,需要的朋友可以參考下
    2023-01-01
  • Python Cookie 讀取和保存方法

    Python Cookie 讀取和保存方法

    今天小編就為大家分享一篇Python Cookie 讀取和保存方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • 基于python生成詞云圖的代碼示例

    基于python生成詞云圖的代碼示例

    這篇文章主要個(gè)介紹了如何基于python生成詞云圖的代碼示例,文中有詳細(xì)的代碼示例喝圖文講解,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-11-11
  • 安裝好Pycharm后如何配置Python解釋器簡(jiǎn)易教程

    安裝好Pycharm后如何配置Python解釋器簡(jiǎn)易教程

    這篇文章主要介紹了安裝好Pycharm后如何配置Python解釋器簡(jiǎn)易教程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Python-openpyxl表格讀取寫(xiě)入的案例詳解

    Python-openpyxl表格讀取寫(xiě)入的案例詳解

    這篇文章主要介紹了Python-openpyxl表格讀取寫(xiě)入的案例分析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 在python3中使用Supervisor的詳細(xì)教程

    在python3中使用Supervisor的詳細(xì)教程

    Supervisor是用Python開(kāi)發(fā)的一個(gè)client/server服務(wù),是Linux/Unix系統(tǒng)下的一個(gè)進(jìn)程管理工具,不支持Windows系統(tǒng),本文給大家介紹在python3中使用Supervisor的方法,感興趣的朋友一起看看吧
    2022-01-01
  • 在python中實(shí)現(xiàn)發(fā)送短信功能

    在python中實(shí)現(xiàn)發(fā)送短信功能

    工作中我們經(jīng)常會(huì)用到發(fā)短信的需求,那么如何在python代碼中實(shí)現(xiàn)發(fā)短息你的需求呢,本文我們就一起深入探討下,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-04-04
  • Python輕松實(shí)現(xiàn)提取視頻音頻并去除靜音片段

    Python輕松實(shí)現(xiàn)提取視頻音頻并去除靜音片段

    在處理視頻素材時(shí),我們常常需要提取其中的音頻,并且希望去除冗長(zhǎng)的靜音部分,借助Python的幾個(gè)優(yōu)秀庫(kù),我們可以快速實(shí)現(xiàn)這一需求,下面我們就來(lái)看看具體實(shí)現(xiàn)方法吧
    2025-10-10
  • 基于Python實(shí)現(xiàn)自動(dòng)點(diǎn)擊器

    基于Python實(shí)現(xiàn)自動(dòng)點(diǎn)擊器

    顧名思義,Python 中的自動(dòng)點(diǎn)擊器是一個(gè)簡(jiǎn)單的 Python 應(yīng)用程序,它根據(jù)用戶要求重復(fù)單擊鼠標(biāo), 不同的參數(shù)可以根據(jù)用戶進(jìn)行更改,下面我們就來(lái)看看具體實(shí)現(xiàn)方法吧
    2023-10-10

最新評(píng)論

读书| 连云港市| 江孜县| 抚宁县| 龙泉市| 林州市| 贵阳市| 平利县| 乌拉特中旗| 龙江县| 五台县| 嘉禾县| 衡南县| 尉犁县| 新宁县| 滁州市| 玉林市| 余干县| 崇礼县| 麻栗坡县| 新竹县| 彩票| 德江县| 晋宁县| 福海县| 古交市| 建阳市| 察哈| 海南省| 蓬溪县| 庄浪县| 定边县| 晋中市| 亚东县| 漾濞| 个旧市| 崇仁县| 阳春市| 新乐市| 东乡县| 香格里拉县|