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

Python中os.system()、subprocess.run()、call()、check_output()的用法

這篇具有很好參考價值的文章主要介紹了Python中os.system()、subprocess.run()、call()、check_output()的用法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.os.system()

os.system() 是對 C 語言中 system() 系統(tǒng)函數(shù)的封裝,允許執(zhí)行一條命令,并返回退出碼(exit code),命令輸出的內(nèi)容會直接打印到屏幕上,無法直接獲取。

示例:文章來源地址http://www.zghlxwxcb.cn/news/detail-526442.html

# test.py
import os
os.system("ls -l | grep test")    # 允許管道符

# 測試執(zhí)行
$ ll                <======== 列出當前目錄中的內(nèi)容
drwxr-xr-x 2 foo foo 4096 Feb 13 09:09 __pycache__
-rw-r--r-- 1 foo foo  359 Feb 19 09:21 test.py
$ python test.py
-rw-r--r-- 1 foo foo  359 Feb 19 09:21 test.py    <======== 只有名字包含 test 的文件被列出

2.subprocess.run()

Python 3.5 開始推薦使用這個方法執(zhí)行命令,其原型如下:

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

其中:

  • args: 可以是一個字符串(當 shell=True 時),也可以是一個列表(當 shell=False 時)

  • stdin, stdout, stderr: 用于指定標準IO文件句柄,可以是:

      subprocess.PIPE: 用作 stdout, stderr 參數(shù)的值時,可以從返回值對象中的 stdout 和 stderr 屬性中讀取輸出內(nèi)容
      subprocess.STDOUT: 用作 stderr 參數(shù)的值時,相當于把標準錯誤重定向到標準輸入中)
      subprocess.DEVNULL: 用作 stdout, stderr 參數(shù)的值時,相當于把輸出內(nèi)容重定向到 /dev/null
      用戶已經(jīng)打開的文件對象或描述符(整型數(shù)字)
    
  • capture_output: 當設置為 True 時,相當于 stdout 和 stderr 參數(shù)都設置為 True 了,可以通過返回值對象訪問標準輸出和標準錯誤內(nèi)容

  • shell: 當設置為 True 時,args 參數(shù)會當做一條命令字符串(支持管道、重定向操作);當它為 False 時,args 需是一個列表(并且不支持管道、重定向操作)

  • cwd: 指定執(zhí)行命令的目錄,默認為當前目錄

  • timeout: 指定命令執(zhí)行超時時間(按妙計),若執(zhí)行超時了,會 kill 掉命令并拋出 TimeoutExpired 異常

  • check: 當設置為 True 時,會自動檢測執(zhí)行退出碼,若不為0,則拋出 CalledProcessError 異常

  • text: 當設置為 True 時,stdin、stdout、stderr 會以“文本”模式打開(返回值對象中的 stdout、stderr 存儲文本內(nèi)容),否則返回值對象中 stdout、stderr 存儲的是字節(jié)序列

  • env: 用于設置程序執(zhí)行時繼承的環(huán)境變量等,默認與當前進程相同

該方法返回一個 CompletedProcess 對象,其中包含以下屬性:

  • returncode: 執(zhí)行命令的退出碼
  • stdout: 捕獲的標準輸出內(nèi)容(當 stdout 參數(shù)為 PIPE 時)。其格式默認為字節(jié)序列,除非 text 參數(shù)為 True (此時為文本格式)。
  • stderr: 捕獲的標準錯誤內(nèi)容(當 stderr 參數(shù)為 PIPE 時)。其格式默認為字節(jié)序列,除非 text 參數(shù)為 True (此時為文本格式)。
  • args: 同參數(shù) args 。

示例:

import subprocess
subprocess.run(["ls", "-l"])            # 默認時,args 參數(shù)需是一個列表
subprocess.run("ls -l", shell=True)     # 當 shell 為 True 時,args 是一個字符串
ret = subprocess.run("ls -l", shell=True, capture_output=True, text=True) # 以文本模式捕獲輸出內(nèi)容
print("Return code:", ret.returncode)   # Return code: 0
print("STDOUT:", ret.stdout)            # STDOUT: ...當前目錄內(nèi)容...
print("STDERR:", ret.stderr)            # STDERR: <空>
ret = subprocess.run("abcdefg", shell=True, text=True,  # 注意:這里必須 shell=True 才能捕獲到 /bin/sh 的輸出錯誤
        # 當 shell=False 時,是要去捕獲 "abcdefg" 命令自身輸出的內(nèi)容,但是它不存在,python 會報錯
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT    # 標準錯誤重定向到標準輸出
) 
print("STDOUT:", ret.stdout)            # STDOUT: /bin/sh: abcdefg: command not found

另一個用于測試 shell 參數(shù)區(qū)別的示例如下:

import sys, re, subprocess
if len(sys.argv) == 1:  # parent process
    cmd = ["python", sys.argv[0], "--run-child"]
    
    ret = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    print(ret) # CompletedProcess(args=['python', 'test.py', '--run-child'], returncode=0, stdout='stdout output\n', stderr='stderr output')
    assert re.match("stdout output", ret.stdout)
    assert re.match("stderr output", ret.stderr)    # 如果 cmd 中的命令不存在,這里是捕獲不到的,subprocess.run()自己就會報錯
    
    ret = subprocess.run(" ".join(cmd), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
    print(ret) # CompletedProcess(args='python test.py --run-child', returncode=0, stdout='stdout output\n', stderr='stderr output')
    assert re.match("stdout output", ret.stdout)
    assert re.match("stderr output", ret.stderr)    # 如果 cmd 中的命令不存在,這里也是可以捕獲到的,內(nèi)容可能是 xxx command not found
    
    print("Passed!")
else:                   # child process
    print("stdout output")
    sys.stderr.write("stderr output")

3.subprocess.call()

Python 3.5 以前(包括 2.x 版本)沒有 subprocess.run() 方法,可以使用 subprocess.call() 來執(zhí)行命令,該方法原型如下:

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)

注意:這個方法的返回值是命令的退出碼,而不是一個對象,所以無法像 subprocess.run() 一樣捕獲命令輸出內(nèi)容(不要設置 stdout=PIPE 或 stderr=PIPE,否則可能造成命令卡死)。

該方法的其它參數(shù)與 subprocess.run() 類似。

4.subprocess.check_output()

Python 3.5 以前的版本,要想捕獲命令輸出內(nèi)容,可以使用 subprocess.check_output() 方法,它的原型如下:

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None)

注意:參數(shù)中沒有 stdout ,因為這個函數(shù)的返回值默認就是標準輸出內(nèi)容,也可以將設置 stderr=subprocess.STDOUT 將標準錯誤重定向到標準輸出,但是好像沒有辦法單獨捕獲標準錯誤內(nèi)容呢!

示例:

import sys, re, subprocess
#Python小白學習交流群:711312441
if len(sys.argv) == 1:  # parent process
    cmd = ["python", sys.argv[0], "--run-child"]
    ret = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
    print("[" + ret + "]")  # 輸出內(nèi)容中包含標準輸出和標準錯誤,輸出順序在 windows 下和 linux 下可能會有差異
    assert re.search("stdout output", ret)
    assert re.search("stderr output", ret)
    print("Passed!")
else:                   # child process
    print("stdout output")
    sys.stderr.write("stderr output")

到了這里,關于Python中os.system()、subprocess.run()、call()、check_output()的用法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • subprocess.run方法

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

    2024年02月12日
    瀏覽(21)
  • electron-builder 打包 exe 報錯 Error output: Plugin not found, cannot call UAC::_

    報錯信息: Error: C:Users***AppDataLocalelectron-buildercachensisnsis-3.0.1.13Binmakensis.exe exited with code 1 Output: Command line defined: \\\"APP_ID=com.baidu.app\\\" Command line defined: \\\"APP_GUID=fb00ccb0-0875-5f26-8d91-d8b573c5a860\\\" Command line defined: \\\"PRODUCT_NAME=Baidu\\\" Command line defined: \\\"PRODUCT_FILENAME=Baidu\\\" Command line define

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

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

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

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

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

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

    2024年02月16日
    瀏覽(18)
  • VBA(15)調(diào)用宏Call與Run

    VBA(15)調(diào)用宏Call與Run

    開頭:調(diào)用宏或函數(shù)(SUB/Function)需是常規(guī)或公用聲明(Public) 本次測試用工作本與調(diào)用的宏如圖: ?待調(diào)用宏 1.XLS : Sub st1() ? ? MsgBox \\\"表1.xls!Sheet1的宏\\\" End Sub Sub tt1() ? ? MsgBox \\\"表1.xls!ThisWorkbook的宏\\\" End Sub Sub mt1() ? ? MsgBox \\\"表1.xls!模塊的宏\\\" End Sub ? 待調(diào)用宏 2.XLS : Sub abc1() ?

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

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

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

    2024年01月24日
    瀏覽(17)
  • MIT6.S081 - Lab2: system calls

    step1:系統(tǒng)調(diào)用聲明 user/user.h :系統(tǒng)調(diào)用函數(shù)(如 int fork(void) ) step2:ecall 進入內(nèi)核態(tài) user/usys.S (該文件由 user/usys.pl 生成,后續(xù)添加函數(shù)可以在這里添加):執(zhí)行如下命令 將系統(tǒng)調(diào)用的編號(在 kernel/syscall.h 中定義)寫入 a7 寄存器 從 ecall 進入中斷處理函數(shù) step3:保存數(shù)據(jù)并

    2024年04月23日
    瀏覽(20)
  • MIT 6s081 lab2:system calls

    作業(yè)地址:Lab: System calls (mit.edu) Add $U/_trace to UPROGS in Makefile add a prototype for the system call to user/user.h , a stub to user/usys.pl , and a syscall number to kernel/syscall.h . The Makefile invokes the perl script user/usys.pl Add a sys_trace() function in kernel/sysproc.c that implements the new system call by remembering its argument

    2024年01月18日
    瀏覽(27)
  • Django報錯:SystemCheckError: System check identified some issues解決辦法

    Django報錯:SystemCheckError: System check identified some issues解決辦法

    今天練習django自定義標簽時,一開始在APP book 中寫了自定義標簽 book_tags.py 測試成功,之后新建了一個APP blogs ,測試在blogs中創(chuàng)建模板使用自定義標簽,于是直接把book/templatetags包直接賦值到blogs目錄里。在頁面里加載自定義標簽。運行服務報錯: 觀察errors:大概意思是blogs和

    2024年02月10日
    瀏覽(17)
  • 6.s081/6.1810(Fall 2022)Lab2: System calls

    6.s081/6.1810(Fall 2022)Lab2: System calls

    這個lab主要介紹了用戶態(tài)到內(nèi)核態(tài)的系統(tǒng)調(diào)用做了什么,并讓我們照貓畫虎完成了兩個系統(tǒng)調(diào)用的實現(xiàn)。 環(huán)境搭建 Lab1: Utilities Lab2: System calls Lab3: Page tables Lab4: Traps Lab5: Copy-on-Write Fork for xv6 官網(wǎng)鏈接 xv6手冊鏈接,這個挺重要的,建議做lab之前最好讀一讀。 xv6手冊中文版,這

    2024年02月13日
    瀏覽(49)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包