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

这篇具有很好参考价值的文章主要介绍了Python中os.system()、subprocess.run()、call()、check_output()的用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.os.system()

os.system() 是对 C 语言中 system() 系统函数的封装,允许执行一条命令,并返回退出码(exit code),命令输出的内容会直接打印到屏幕上,无法直接获取。

示例:文章来源地址https://www.toymoban.com/news/detail-526442.html

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

# 测试执行
$ ll                <======== 列出当前目录中的内容
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 开始推荐使用这个方法执行命令,其原型如下:

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 参数的值时,可以从返回值对象中的 stdout 和 stderr 属性中读取输出内容
      subprocess.STDOUT: 用作 stderr 参数的值时,相当于把标准错误重定向到标准输入中)
      subprocess.DEVNULL: 用作 stdout, stderr 参数的值时,相当于把输出内容重定向到 /dev/null
      用户已经打开的文件对象或描述符(整型数字)
    
  • capture_output: 当设置为 True 时,相当于 stdout 和 stderr 参数都设置为 True 了,可以通过返回值对象访问标准输出和标准错误内容

  • shell: 当设置为 True 时,args 参数会当做一条命令字符串(支持管道、重定向操作);当它为 False 时,args 需是一个列表(并且不支持管道、重定向操作)

  • cwd: 指定执行命令的目录,默认为当前目录

  • timeout: 指定命令执行超时时间(按妙计),若执行超时了,会 kill 掉命令并抛出 TimeoutExpired 异常

  • check: 当设置为 True 时,会自动检测执行退出码,若不为0,则抛出 CalledProcessError 异常

  • text: 当设置为 True 时,stdin、stdout、stderr 会以“文本”模式打开(返回值对象中的 stdout、stderr 存储文本内容),否则返回值对象中 stdout、stderr 存储的是字节序列

  • env: 用于设置程序执行时继承的环境变量等,默认与当前进程相同

该方法返回一个 CompletedProcess 对象,其中包含以下属性:

  • returncode: 执行命令的退出码
  • stdout: 捕获的标准输出内容(当 stdout 参数为 PIPE 时)。其格式默认为字节序列,除非 text 参数为 True (此时为文本格式)。
  • stderr: 捕获的标准错误内容(当 stderr 参数为 PIPE 时)。其格式默认为字节序列,除非 text 参数为 True (此时为文本格式)。
  • args: 同参数 args 。

示例:

import subprocess
subprocess.run(["ls", "-l"])            # 默认时,args 参数需是一个列表
subprocess.run("ls -l", shell=True)     # 当 shell 为 True 时,args 是一个字符串
ret = subprocess.run("ls -l", shell=True, capture_output=True, text=True) # 以文本模式捕获输出内容
print("Return code:", ret.returncode)   # Return code: 0
print("STDOUT:", ret.stdout)            # STDOUT: ...当前目录内容...
print("STDERR:", ret.stderr)            # STDERR: <空>
ret = subprocess.run("abcdefg", shell=True, text=True,  # 注意:这里必须 shell=True 才能捕获到 /bin/sh 的输出错误
        # 当 shell=False 时,是要去捕获 "abcdefg" 命令自身输出的内容,但是它不存在,python 会报错
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT    # 标准错误重定向到标准输出
) 
print("STDOUT:", ret.stdout)            # STDOUT: /bin/sh: abcdefg: command not found

另一个用于测试 shell 参数区别的示例如下:

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 中的命令不存在,这里也是可以捕获到的,内容可能是 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() 来执行命令,该方法原型如下:

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

注意:这个方法的返回值是命令的退出码,而不是一个对象,所以无法像 subprocess.run() 一样捕获命令输出内容(不要设置 stdout=PIPE 或 stderr=PIPE,否则可能造成命令卡死)。

该方法的其它参数与 subprocess.run() 类似。

4.subprocess.check_output()

Python 3.5 以前的版本,要想捕获命令输出内容,可以使用 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)

注意:参数中没有 stdout ,因为这个函数的返回值默认就是标准输出内容,也可以将设置 stderr=subprocess.STDOUT 将标准错误重定向到标准输出,但是好像没有办法单独捕获标准错误内容呢!

示例:

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 + "]")  # 输出内容中包含标准输出和标准错误,输出顺序在 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()的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • subprocess.run方法

    subprocess.run 是 Python 中用于在程序中运行其他程序的方法。它是 Python 3.5 版本引入的,可以用来替代旧版本中的 subprocess.call 和 subprocess.check_call 等函数。 使用 subprocess.run 方法,你可以很方便地在 Python 中调用其他命令行程序,并且能够简单地获取命令的输出结果。此外,该方

    2024年02月12日
    浏览(35)
  • 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日
    浏览(34)
  • 【已解决】pip subprocess to install build dependencies did not run successfully.

    不要输入版本号。 例如 pandas==1.0.5,安装这个的时候就会出现这个问题,但是当我去掉版本号,只用命令conda install pandas 来进行安装时就不会产生这个报错。同理scipy==1.5.0也是。 用了将近一天的时间来配置环境,尝试了各种方法,结果竟是这样解决就行了,我是废物。

    2024年02月12日
    浏览(49)
  • keil错误和解决办法(1):FCARM - Output Name not specified, please check ‘Options for Target - Utilities‘

    这个错误是由于新导入到工程内的文件,未被正确识别而引发的错误 报错: FCARM - Output Name not specified, please check ‘Options for Target - Utilities’ 原因:用户的.c和.h文件往往都是新建txt,然后改的后缀,这样的文件被导入keil后,有可能会被识别成image file。 在新导入到keil中的文

    2024年02月16日
    浏览(48)
  • VBA(15)调用宏Call与Run

    开头:调用宏或函数(SUB/Function)需是常规或公用声明(Public) 本次测试用工作本与调用的宏如图:  待调用宏 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   待调用宏 2.XLS : Sub abc1()  

    2024年02月04日
    浏览(41)
  • keil5编译中出现的错误(6):FCARM - Output Name not specified, please check ‘Options for Target - Utilities‘

    在导入其他文件进入工程中会出现这个错误:FCARM - Output Name not specified, please check \\\'Options for Target - Utilities\\\' 我在网上找了好多个博主的文章,试了好几个方法,花了几个小时一直解决不了,最后才发现是导入时导入文件的格式选错了。。。 本文将列出报这个错误的两个常见情

    2024年01月24日
    浏览(48)
  • MIT6.S081 - Lab2: system calls

    step1:系统调用声明 user/user.h :系统调用函数(如 int fork(void) ) step2:ecall 进入内核态 user/usys.S (该文件由 user/usys.pl 生成,后续添加函数可以在这里添加):执行如下命令 将系统调用的编号(在 kernel/syscall.h 中定义)写入 a7 寄存器 从 ecall 进入中断处理函数 step3:保存数据并

    2024年04月23日
    浏览(44)
  • MIT 6s081 lab2:system calls

    作业地址: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日
    浏览(43)
  • Django报错:SystemCheckError: System check identified some issues解决办法

    今天练习django自定义标签时,一开始在APP book 中写了自定义标签 book_tags.py 测试成功,之后新建了一个APP blogs ,测试在blogs中创建模板使用自定义标签,于是直接把book/templatetags包直接赋值到blogs目录里。在页面里加载自定义标签。运行服务报错: 观察errors:大概意思是blogs和

    2024年02月10日
    浏览(32)
  • 6.s081/6.1810(Fall 2022)Lab2: System calls

    这个lab主要介绍了用户态到内核态的系统调用做了什么,并让我们照猫画虎完成了两个系统调用的实现。 环境搭建 Lab1: Utilities Lab2: System calls Lab3: Page tables Lab4: Traps Lab5: Copy-on-Write Fork for xv6 官网链接 xv6手册链接,这个挺重要的,建议做lab之前最好读一读。 xv6手册中文版,这

    2024年02月13日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包