国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

python subprocess.run()、subprocess.Popen()、subprocess.check_output()(執(zhí)行系統(tǒng)命令、啟動新的進(jìn)程、連接到子進(jìn)程的輸入/輸出管道)

這篇具有很好參考價(jià)值的文章主要介紹了python subprocess.run()、subprocess.Popen()、subprocess.check_output()(執(zhí)行系統(tǒng)命令、啟動新的進(jìn)程、連接到子進(jìn)程的輸入/輸出管道)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


python subprocess.run()、subprocess.Popen()、subprocess.check_output()(執(zhí)行系統(tǒng)命令、啟動新的進(jìn)程、連接到子進(jìn)程的輸入/輸出管道),Python,linux,python,服務(wù)器

python subprocess

Python的subprocess模塊是用于創(chuàng)建和管理子進(jìn)程的模塊。它提供了一種在Python中調(diào)用外部命令的方式,可以執(zhí)行系統(tǒ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,則會拋出CalledProcessError異常。
  • timeout參數(shù)用于指定子進(jìn)程的超時(shí)時(shí)間。
  • encoding和errors參數(shù)用于指定輸入/輸出的編碼方式和錯(cuò)誤處理方式。
示例(只可以捕獲標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤不知道咋獲取,異常也沒拋。。。以后再看,現(xiàn)在有事)
import subprocess


def execute_update_ip_sh(ip):
    """
    執(zhí)行修改配置文件 ip 腳本,將會修改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ò)誤輸出(打印不出來)
        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")

python subprocess.run()、subprocess.Popen()、subprocess.check_output()(執(zhí)行系統(tǒng)命令、啟動新的進(jìn)程、連接到子進(jìn)程的輸入/輸出管道),Python,linux,python,服務(wù)器

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)
  • 啟動一個(gè)新的進(jìn)程,并返回一個(gè)Popen對象,可以用于與子進(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è)文件對象或一個(gè)文件描述符。默認(rèn)值為None,表示使用父進(jìn)程的標(biāo)準(zhǔn)輸入。
- stdout:指定子進(jìn)程的標(biāo)準(zhǔn)輸出??梢允且粋€(gè)文件對象或一個(gè)文件描述符。默認(rèn)值為None,表示使用父進(jìn)程的標(biāo)準(zhǔn)輸出。
- stderr:指定子進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤輸出??梢允且粋€(gè)文件對象或一個(gè)文件描述符。默認(rèn)值為None,表示使用父進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤輸出。
- preexec_fn:在子進(jìn)程執(zhí)行前調(diào)用的可調(diào)用對象。默認(rèn)值為None,表示不調(diào)用任何函數(shù)。
示例:使用preexec_fn來將Popen對象綁定進(jìn)程組

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

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

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

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

import subprocess
import os
import signal

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

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

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

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

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

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

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

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

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

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

import subprocess

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

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

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

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

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

import subprocess

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

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

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

  • 不使用shell執(zhí)行:
import subprocess

# 不通過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()對象,分別對應(yīng)兩個(gè)命令。command1執(zhí)行了ls -l命令,并將輸出通過管道傳遞給command2。command2執(zhí)行了grep .txt命令,并將結(jié)果輸出到標(biāo)準(zhǔn)輸出。

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

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

- cwd:指定子進(jìn)程的當(dāng)前工作目錄。默認(rèn)值為None,表示使用父進(jìn)程的當(dāng)前工作目錄。
- env:指定子進(jìn)程的環(huán)境變量??梢允且粋€(gè)字典,表示環(huán)境變量的鍵值對。默認(rèn)值為None,表示使用父進(jìn)程的環(huán)境變量。
- universal_newlines:指定是否將輸入/輸出流以文本模式打開。默認(rèn)值為False,表示以二進(jìn)制模式打開。
- startupinfo:指定子進(jìn)程的啟動信息。可以是一個(gè)subprocess.STARTUPINFO對象,用于設(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ù)信號處理程序。默認(rèn)值為True,表示恢復(fù)信號處理程序。
- start_new_session:指定是否在新的會話中啟動子進(jìn)程。默認(rèn)值為False,表示在當(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ù)會返回一個(gè)Popen對象,可以用于與子進(jìn)程進(jìn)行交互。Popen對象具有一些常用的方法和屬性,比如communicate()、wait()、poll()terminate()、kill()stdout、stderrreturncode等。

Popen對象的常用方法和屬性
  • 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)

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

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

subprocess.check_output

subprocess.check_output函數(shù)是Python標(biāo)準(zhǔn)庫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ù)會執(zhí)行指定的命令,并等待命令執(zhí)行完成。如果命令執(zhí)行成功,它會返回命令的輸出結(jié)果(以字節(jié)字符串的形式),如果命令執(zhí)行失敗,它會拋出一個(gè)CalledProcessError異常。

在上述代碼中,subprocess.check_output函數(shù)被用于執(zhí)行一些系統(tǒng)命令,如ip addr showip route show,以獲取當(dāng)前以太網(wǎng)接口的IP配置信息。文章來源地址http://www.zghlxwxcb.cn/news/detail-699275.html

到了這里,關(guān)于python subprocess.run()、subprocess.Popen()、subprocess.check_output()(執(zhí)行系統(tǒng)命令、啟動新的進(jìn)程、連接到子進(jìn)程的輸入/輸出管道)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • python subprocess執(zhí)行外部命令常用方法

    python subprocess執(zhí)行外部命令常用方法

    subprocess模塊是Python標(biāo)準(zhǔn)庫中的一個(gè)模塊,用于創(chuàng)建和控制子進(jìn)程。它提供了一種在Python程序中調(diào)用其他外部命令、執(zhí)行系統(tǒng)命令和與系統(tǒng)進(jìn)程進(jìn)行交互的方法。常用的有兩種方法:subprocess.run(),subprocess.Popen() 1. subprocess.run()方法 subprocess.run()是subprocess模塊中一個(gè)常用的函數(shù),

    2024年02月06日
    瀏覽(17)
  • 使用python的subprocess執(zhí)行命令、交互、等待、是否結(jié)束、解析JSON結(jié)果

    Python的subprocess模塊提供了一種在Python中調(diào)用外部命令的方法。它允許您在Python程序中啟動新進(jìn)程,連接到它們的輸入/輸出/錯(cuò)誤管道,并等待它們完成。 下面是一些subprocess模塊的常用用法: 運(yùn)行外部命令并獲取輸出: 運(yùn)行外部命令并獲取返回值: 運(yùn)行外部命令并將輸出重

    2024年02月08日
    瀏覽(21)
  • error: subprocess-exited-with-error × python setup.py egg_info did not run successfully.報(bào)錯(cuò)

    報(bào)錯(cuò)的具體信息: 網(wǎng)上找的改正方法是: pip install --upgrade setuptools 但是不行,最后仔細(xì)看了報(bào)錯(cuò)信息,謎底就在謎面上??!Here is how to fix this error in the main use cases:這一行給出了修補(bǔ)方法,我直接簡單粗暴整最后一個(gè)。 在環(huán)境中加入SKLEARN_ALLOW_DEPRECATED_SKLEARN_PACKAGE_INSTALL=True這

    2024年01月19日
    瀏覽(22)
  • subprocess.run方法

    subprocess.run 是 Python 中用于在程序中運(yùn)行其他程序的方法。它是 Python 3.5 版本引入的,可以用來替代舊版本中的 subprocess.call 和 subprocess.check_call 等函數(shù)。 使用 subprocess.run 方法,你可以很方便地在 Python 中調(diào)用其他命令行程序,并且能夠簡單地獲取命令的輸出結(jié)果。此外,該方

    2024年02月12日
    瀏覽(19)
  • 【已解決】pip subprocess to install build dependencies did not run successfully.

    【已解決】pip subprocess to install build dependencies did not run successfully.

    不要輸入版本號。 例如 pandas==1.0.5,安裝這個(gè)的時(shí)候就會出現(xiàn)這個(gè)問題,但是當(dāng)我去掉版本號,只用命令conda install pandas 來進(jìn)行安裝時(shí)就不會產(chǎn)生這個(gè)報(bào)錯(cuò)。同理scipy==1.5.0也是。 用了將近一天的時(shí)間來配置環(huán)境,嘗試了各種方法,結(jié)果竟是這樣解決就行了,我是廢物。

    2024年02月12日
    瀏覽(31)
  • keil錯(cuò)誤和解決辦法(1):FCARM - Output Name not specified, please check ‘Options for Target - Utilities‘

    keil錯(cuò)誤和解決辦法(1):FCARM - Output Name not specified, please check ‘Options for Target - Utilities‘

    這個(gè)錯(cuò)誤是由于新導(dǎo)入到工程內(nèi)的文件,未被正確識別而引發(fā)的錯(cuò)誤 報(bào)錯(cuò): FCARM - Output Name not specified, please check ‘Options for Target - Utilities’ 原因:用戶的.c和.h文件往往都是新建txt,然后改的后綴,這樣的文件被導(dǎo)入keil后,有可能會被識別成image file。 在新導(dǎo)入到keil中的文

    2024年02月16日
    瀏覽(18)
  • keil5編譯中出現(xiàn)的錯(cuò)誤(6):FCARM - Output Name not specified, please check ‘Options for Target - Utilities‘

    keil5編譯中出現(xiàn)的錯(cuò)誤(6):FCARM - Output Name not specified, please check ‘Options for Target - Utilities‘

    在導(dǎo)入其他文件進(jìn)入工程中會出現(xiàn)這個(gè)錯(cuò)誤:FCARM - Output Name not specified, please check \\\'Options for Target - Utilities\\\' 我在網(wǎng)上找了好多個(gè)博主的文章,試了好幾個(gè)方法,花了幾個(gè)小時(shí)一直解決不了,最后才發(fā)現(xiàn)是導(dǎo)入時(shí)導(dǎo)入文件的格式選錯(cuò)了。。。 本文將列出報(bào)這個(gè)錯(cuò)誤的兩個(gè)常見情

    2024年01月24日
    瀏覽(16)
  • chatgpt賦能python:Python的Popen介紹及使用方法

    在Python編程中,我們經(jīng)常需要執(zhí)行外部命令并獲取結(jié)果。而Python中的Popen函數(shù)就是一個(gè)方便的工具,可以啟動另一個(gè)進(jìn)程并與之交互。在本文中,我們將介紹Popen的基礎(chǔ)知識以及使用方法。 Popen是Python的subprocess模塊提供的一個(gè)函數(shù),可以啟動一個(gè)新進(jìn)程并與之交互。它的基本

    2024年02月10日
    瀏覽(22)
  • Python3 os.makedev() 方法、Python3 os.popen() 方法

    概述 os.makedev() 方法用于以major和minor設(shè)備號組成一個(gè)原始設(shè)備號。 語法 makedev() 方法語法格式如下: 參數(shù) major ?-- Major 設(shè)備號。 minor ?-- inor 設(shè)備號。 返回值 返回設(shè)備號。 實(shí)例 以下實(shí)例演示了 makedev() 方法的使用: 執(zhí)行以上程序輸出結(jié)果為: 概述 os.popen() 方法用于從一個(gè)

    2023年04月09日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包