我目前正在尝试从纯stderr或截取脚本并捕获其异常获取python堆栈跟踪和错误的属性。两种方式都可以。这可能是一个XY问题,因此欢迎其他选择
我目前正在编写一个程序,将参数重定向到调用另一个python脚本:
import sys, subprocess
pyargs = sys.argv[1:] # Suppose pyargs is something like ["a.py", "123"]
result = subprocess.run(["python"] + pyargs, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
error = result.stderr # do something with this
我不确定是否有任何现有的方法支持这两个计划中的任何一个。我知道python错误转储以非常公式化的方式显示:
import sys, traceback
exc_type, exc_value, exc_traceback = sys.exc_info() # shows formatting
traceback.print_exc() # prints the stderr of what we wanted.
所以我想也许我们可以解析stderr,看看会发生什么
我知道我们可以用subprocess.run(..., check=True)
运行子进程来获得subprocess.SubprocessError
,但是由于子进程可以是任何东西(不仅仅是python进程),我们实际上无法截获发生的实际的异常
将python文件作为模块加载到此文件时的一个问题是,我们无法提供必要的参数,除非我们能够以某种方式欺骗从底层脚本运行的sys.argv[]
或argparse
。可能有if __name__ == "__main__":
的脚本也不会执行,除非我们也欺骗它
有什么想法吗
我更喜欢方法#2。只要可能,我都避免使用
subprocess
或system
从Python调用Python更改
sys.argv
的值很容易-只需使用常规赋值覆盖它欺骗}? ,您可以使用
__name__ == "__main__"
条件更难。不幸的是,这可能意味着您不能以通常的方式简单地导入模块。根据How to import a module as ^{runpy
模块来执行您的模块,并提供您喜欢的__name__
的任何值现在您可以捕获模块抛出的任何未捕获的异常,并在
except
中以您喜欢的方式处理它们相关问题 更多 >
编程相关推荐