【问题标题】:Return full error message from subprocess从子进程返回完整的错误消息
【发布时间】:2021-09-01 17:09:28
【问题描述】:

我想从使用 subprocess 模块执行的失败 Python 脚本中获取完整的描述性错误消息。

我有一个以下脚本 sub_script.py 在单独执行时失败并产生 IndexError: pop from empty list 错误:

# sub_script.py

empty_list = []
empty_list.pop()

我从sub_test.py 拨打sub_script.py 如下:

# sub_test.py

import subprocess
import sys

print(str(subprocess.run([sys.executable, 'sub_script.py'],
                         check=True,
                         capture_output=True)))

但是我只收到subprocess.CalledProcessError 错误。

Traceback (most recent call last):
  File "/Users/my_user/Desktop/my_dir/sub_test.py", line 4, in <module>
    print(str(subprocess.run([sys.executable, 'sub_script.py'],
  File "/usr/local/Cellar/python@3.9/3.9.5/Frameworks/Python.framework/Versions/3.9/lib/python3.9/subprocess.py", line 528, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['/usr/local/opt/python@3.9/bin/python3.9', 'sub_script.py']' returned non-zero exit status 1.

我希望看到当sub_script.py (IndexError: pop from empty list) 使用sub_test.py 中的子进程执行时返回的错误的完整描述。

当脚本在subprocess.run 内执行并失败时,是否可能出现完全错误?

【问题讨论】:

  • 这回答了你的问题? stackoverflow.com/questions/24849998/…
  • 我已经试过了,它仍然返回subprocess.CalledProcessError而不是IndexError: pop from empty list
  • 您是否尝试过从subprocess.run() 捕获stdoutstderr
  • 如果你想真正有一个IndexException,你必须导入文件并通过python而不是子进程来完成,如果你只想要错误的输出,链接应该可以工作。跨度>
  • 我必须使用子进程,我无法导入文件@T.Kelher

标签: python python-3.x subprocess


【解决方案1】:

保留subprocess.run 调用的返回值,而不是立即将其转换为str,并且没有check=True

# main.py
import subprocess
import sys

command = [sys.executable, 'task.py']
outcome = subprocess.run(command, check=False, capture_output=True)
print(f"returncode = {outcome.returncode}")
if outcome.returncode != 0:
    # there was an error, we assume the traceback was printed to stderr
    print("there was an error :\n")
    print(outcome.stderr.decode("utf-8"))
# task.py
empty_list = []
empty_list.pop()

输出:

returncode = 1
there was an error :

Traceback (most recent call last):
  File "task.py", line 2, in <module>
    empty_list.pop()
IndexError: pop from empty list

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2016-01-21
    • 2017-01-26
    • 2021-11-16
    • 1970-01-01
    • 2018-12-01
    相关资源
    最近更新 更多