首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python subprocess.run如果您重定向stdout/stderr,则会退出错误而不是正常工作

subprocess.run 是 Python 中的一个函数,用于执行外部命令。当你使用 subprocess.run 并重定向 stdoutstderr 时,如果出现错误,它将引发异常而不是正常工作。

具体来说,subprocess.run 函数用于创建一个子进程并执行指定的命令。它可以接收多个参数,其中最重要的是 args 参数,用于指定要执行的命令及其参数。通过设置 stdoutstderr 参数,你可以将命令的输出重定向到文件或其他地方。

当你重定向 stdoutstderr 时,如果命令执行过程中出现错误,subprocess.run 将抛出一个 CalledProcessError 异常。这是因为重定向输出会导致命令的返回值无法通过函数的返回值传递,所以 subprocess.run 选择通过异常来报告错误。

为了处理这种情况,你可以使用 try-except 块来捕获异常并进行相应的处理。以下是一个示例代码:

代码语言:python
代码运行次数:0
复制
import subprocess

try:
    result = subprocess.run(['command', 'arg1', 'arg2'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
    # 处理命令执行成功的情况
    print(result.stdout.decode())  # 打印命令输出
except subprocess.CalledProcessError as e:
    # 处理命令执行失败的情况
    print(f"命令执行失败,返回码:{e.returncode}")
    print(f"错误信息:{e.stderr.decode()}")

在上面的示例中,subprocess.run 函数执行了一个名为 command 的命令,并将其输出重定向到 stdout。如果命令执行成功,我们可以通过 result.stdout 属性获取命令的输出,并使用 decode() 方法将其转换为字符串。如果命令执行失败,我们可以通过捕获 CalledProcessError 异常来获取返回码和错误信息。

需要注意的是,subprocess.run 函数在 Python 3.5 及以上版本中引入,如果你使用的是较旧的 Python 版本,可以考虑使用 subprocess.Popen 来执行外部命令。

关于 subprocess.run 函数的更多信息,你可以参考腾讯云的相关文档:subprocess.run 函数 - Python 文档

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

属性中读取输出内容 subprocess.STDOUT: 用作 stderr 参数的值时,相当于把标准错误重定向到标准输入中) subprocess.DEVNULL: 用作 stdout,...stderr 参数都设置为 True 了,可以通过返回值对象访问标准输出和标准错误内容shell: 当设置为 True 时,args 参数会当做一条命令字符串(支持管道、重定向操作);当它为 False...# 标准错误重定向到标准输出) print("STDOUT:", ret.stdout) # STDOUT: /bin/sh: abcdefg: command not found...:这个方法的返回值是命令的退出码,不是一个对象,所以无法像 subprocess.run() 一样捕获命令输出内容(不要设置 stdout=PIPE 或 stderr=PIPE,否则可能造成命令卡死)...将标准错误重定向到标准输出,但是好像没有办法单独捕获标准错误内容呢!

72820

Python Subprocess库详解

超时处理 在实际应用中,我们可能希望设置子进程的最长运行时间,以避免因子进程无法正常退出导致父进程一直等待。...实时获取输出 有时候我们希望实时获取子进程的输出,不是等到它完成。...使用subprocess.Popen的stdoutstderr参数进行输出流重定向 subprocess.Popen的stdoutstderr参数允许你将子进程的标准输出和标准错误输出重定向到文件或其他地方...使用subprocess.Popen的timeout参数设置超时时间 subprocess.Popen的timeout参数允许你设置子进程的最长运行时间,以避免因子进程无法正常退出导致父进程一直等待。...使用subprocess模块的stderr参数获取标准错误输出 subprocess.run函数的stderr参数允许你获取命令的标准错误输出。

2.3K21
  • subprocess:Python中创建子进程

    returncode为子进程的退出状态码。通常情况下,退出状态码为0则表示进程成功运行了;一个负值-N表示这个子进程被信号N终止了。...该函数还有许多参数,比如shell,默认值为False表示直接运行命令,如果主动赋值为True则会创建一个中间shell进程,由这个进程运行命令。...通过Shell返回消息 本例会通过一个子shell运行命令,在命令返回错误码并退出之前,将详细输入到控制台。...命令将错误消息返回了。这是因为我们设置了stdoutstderr为subprocess.PIPE,表明这些通道要开放。这样我们才能获取子shell运行的结果获取所运行的错误提示。...) print(repr(stdout_value)) 至于如果命令行错误需要捕获错误消息,可以直接将stderr也设置为PIPE。

    52170

    【愚公系列】2021年12月 Python教学课程 26-系统编程

    方法和变量 用途 os.getcwd() 获取当前工作目录,即当前 python 脚本工作的目录路径 os.chdir(“dirname”) 改变当前脚本工作目录;相当于 shell 下 cd os.curdir...必须是一个字符串,字符串参数列表 stdin、stdoutstderr:子进程的标准输入、输出和错误。...check:如果该参数设置为 True,并且进程退出状态码不是 0,则弹出CalledProcessError 异常。...如果你在调用run()方法时,设置了参数 stderr=subprocess.STDOUT,则错误信息会和 stdout 一起输出,此时 stderr 的值是 None。...subprocess.Popen()类 用法和参数与 run()方法基本类同,但是它的返回值是一个 Popen 对象,不是CompletedProcess 对象。

    88320

    python的subprocess模块

    check: 如果check参数的值是True,且执行命令的进程以非0状态码退出则会抛出一个CalledProcessError的异常,且该异常对象会包含 参数、退出状态码、以及stdoutstderr...stdout, stderr: run()函数默认不会捕获命令执行结果的正常输出和错误输出,如果我们向获取这些内容需要传递subprocess.PIPE,然后可以通过返回的CompletedProcess...类实例的stdoutstderr属性或捕获相应的内容; ​ call()和check_call()函数返回的是命令执行的状态码,不是CompletedProcess类实例,所以对于它们而言,stdout...),这样能保证子进程正常退出避免出现僵尸进程。...所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误 shell:同上 cod:用于设置子进程的当前目录 env:用于指定子进程的环境变量。

    3K20

    Python模块学习:subprocess模块详解

    check: 如果check参数的值是True,且执行命令的进程以非0状态码退出则会抛出一个CalledProcessError的异常,且该异常对象会包含 参数、退出状态码、以及stdoutstderr...run()函数默认不会捕获命令执行结果的正常输出和错误输出,如果我们向获取这些内容需要传递subprocess.PIPE,然后可以通过返回的CompletedProcess类实例的stdoutstderr...属性或捕获相应的内容;call()和check_call()函数返回的是命令执行的状态码,不是CompletedProcess类实例,所以对于它们而言,stdoutstderr不适合赋值为subprocess.PIPE...;check_output()函数默认就会返回命令执行结果,所以不用设置stdout的值,如果我们希望在结果中捕获错误信息,可以执行stderr=subprocess.STDOUT。...cwd: 如果该参数值不是None,则该函数将会在执行这个子进程之前改变当前工作目录。env: 用于指定子进程的环境变量,如果env=None,那么子进程的环境变量将从父进程中继承。如果env!

    59740

    Python 执行系统命令

    执行命令但无法获取取命令输出时,可以使用 os.system os.system() 是C语言 system() 函数的封装,返回命令的退出状态码,命令执行结果输出到标准输出(stdout/窗口...,继承父进程,PIPE表示创建管道 stdout 程序的标准输出句柄,参数意义同上 stderr 程序的标准错误句柄,参数意义同上,特殊,可以设置成STDOUT,表示与标准输出一致 shell 为True...同样,如果希望从stdoutstderr获取数据,必须将stdoutstderr设置为PIPE。 4、Popen.send_signal(signal):向子进程发送信号。...=PIPE, # -1 标准输出(演示器、终端) 保存到管道中以便进行操作 stderr=PIPE, # 标准错误,保存到管道 shell=True) # print(proc.communicate...用法: subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=

    1.7K10

    Python 学习笔记 (8)—— sy

    sys.argv    获取参数 参数获取从0开始,不是1,0为命令本身 #!... os.py  The clear command is : clear sys.exit(n)        设置退出返回值(0表示正常退出,其他非0整数表示不正常,可以通过异常捕获) #!...,sys.stderr 标准输入和标准错误 (通常缩写为 stdout 和 stderr) 是内建在每一个 UNIX 系统中的管道。 ...使用sys重定向输出 print 'Dive in'                 # 标准输出 saveout = sys.stdout            # 在重定向前保存stdout,这样的话之后你还可以将其设回正常...sys.stderr = fsock                               # 将新打开的日志文件的文件对象赋值给stderr重定向标准错误

    85230

    记录Python 调用 subprocess.Popen 卡死解决办法

    subprocess.Popen 是 Python 中用于执行外部命令或程序的模块之一。它提供了创建子进程并与之交互的灵活方式。...=subprocess.PIPE, shell=True, executable="/bin/bash", stderr=subprocess.STDOUT...stderr=subprocess.STDOUT:将子进程的标准错误输出合并到标准输出中。 universal_newlines=True:将输入和输出转换为文本模式,不是字节模式。...('utf-8')}") subprocess.Popen 和 subprocess.runPython 中用于执行外部命令的两个常用函数,它们之间有几个重要的区别: subprocess.Popen...综上所述,subprocess.run 适合简单地执行外部命令并获取输出;subprocess.Popen 适合更灵活地控制子进程,以及处理更复杂的子进程交互,注意不要使用 stdout=subprocess.PIPE

    1.6K10

    猫头虎分享疑难杂Bug:error: subprocess-exited-with-error 解决方案

    本篇博客将带领大家深入了解这一错误的根源,并提供详细的解决方案,以帮助大家顺利完成开发工作。 正文 1. 错误原因分析 在解决任何问题之前,我们首先需要了解问题的根源。...这通常意味着在执行外部命令时,子进程返回了一个非零的退出状态,表示执行失败。 1.2 常见原因 外部命令或脚本本身存在错误。 外部命令所依赖的环境或资源不可用。 调用命令的方式或参数有误。 2....True) print(result.stdout) print(result.stderr) 3....4.1 问题:为什么我在终端可以运行命令,但在 Python 中却报错? 可能的原因包括环境变量在 Python 中未正确设置,或者 Python 中的工作目录与终端不同。...4.2 问题:如何捕获子进程的标准错误输出? 可以使用 subprocess.run 的 capture_output=True 参数来捕获标准错误输出,并通过 result.stderr 访问。

    66220

    Python & Supervisor

    ,就当作已经正常启动了 redirect_stderr=true ; 错误日志重定向到标准输出 loglevel=info 基本配置就先说明一下: username=...false:进程不会自动重启,unexpected:当程序退出时的退出不是exitcodes中定义的时,进程会重启,true:进程会无条件重启当退出的时候。...user 如果supervisord以root运行,则会使用这个设置用户启动子程序 redirect_stderr 如果设置为true,进程则会把标准错误输出到supervisord后台的标准输出文件描述符...到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发 stderr_logfile 把进程的错误日志输出一个文件中,除非redirect_stderr参数被设置为true stderr_logfile_maxbytes...如果设置为0则表示不限制日志文件大小 stderr_logfile_backups 错误日志轮转备份的数量,默认是10,如果设置为0,则不备份 stderr_capture_maxbytes 当进程处于

    61320

    2018年8月25日python中os模块和sys模块的区别

    正常退出时exit(0) sys.hexversion 获取Python解释程序的版本值,16进制格式如:0x020403F0 sys.version 获取Python解释程序的版本信息 sys.maxint...标准输出 sys.stdin 标准输入 sys.stderr 错误输出 sys.exc_clear() 用来清除当前线程所出现的当前的或最近的错误信息 sys.exec_prefix 返回平台独立的...记录python版权相关的东西 sys.api_version 解释器的C的API版本 sys.stdin,sys.stdout,sys.stderr     stdin , stdout ,...Python程序的在Shell中的I/O重定向与本文开始时举的DOS命令的重定向完全相同,其实这种重定向是由Shell来提供的,与Python 本身并无关系。...那么我们可以在Python程序内部将stdin,stdout,stderr读写操作重定向到一个内部对象.

    86130

    一个超强的Python库!HTTP请求性能分析工具推荐:httpstat!

    通过这些功能特性,httpstat提供了一种简单直观的方式来分析和优化HTTP请求的性能,对于网络开发人员和系统管理员来说非常实用。...) else: # 如果命令执行失败,打印错误信息 print(result.stderr) except FileNotFoundError...在httpstat()函数中,我们传递给subprocess.run()函数的参数是一个包含命令和参数的列表。...如果返回码为0,则表示命令执行成功,我们将打印出命令行输出(result.stdout)。否则,如果返回码不为0,表示命令执行失败,我们将打印出错误信息(result.stderr)。...请确保您已经在系统上正确安装了httpstat工具,并且该工具可以在命令行中正常运行。这段代码将帮助您在Python程序中调用httpstat工具,并将结果打印到控制台。

    37210
    领券