我们可以将元组作为参数发送给sys.exit()吗?

1 投票
2 回答
1447 浏览
提问于 2025-04-18 01:23

我在使用 Python 2.6 运行我的脚本。下面是我的需求。

在一个文件夹里有大约 100 个测试脚本(都是 Python 脚本)。我需要创建一个主脚本,这个主脚本会一个接一个地运行这 100 个测试脚本,然后显示每个测试用例是否失败。每个脚本都会调用 sys.exit() 来结束执行。目前,我是从主脚本中读取 sys.exit() 的返回值,然后判断特定的测试用例是否失败。

但是现在需求变了,我还需要显示日志文件的名称(日志文件会在我运行脚本时创建)。所以我能不能把一个包含状态和日志文件名的元组作为参数传给 sys.exit(),而不是传一个整数值呢?

我在网上看到,如果我们传递一个非整数的参数,None 相当于传递零,而其他任何对象都会被打印到 stderr,并导致退出代码为 1。所以如果我传一个元组作为参数,os 会不会在成功的情况下也认为是失败,因为我没有传 None 呢?

我在主脚本中使用 subprocess.popen() 来运行这些脚本,并且使用 format() 来读取 sys.exit() 的值。

2 个回答

2

没错,你说得对。传递一个元组会把这个元组打印到错误输出(stderr)上,并且返回一个退出代码1。你必须返回None来表示成功。

注意,这是一种在命令行和类似环境中的约定,并不是强制要求的。不过,这些约定存在是有很好的理由的。

5

不,你不能这样做。sys.exit() 只是用来设置程序的退出代码,仅此而已。没有其他方式可以用这个代码做什么,除了把它设置为一个整数。

不过,你可以把数据写入 sys.stdoutsys.stderr,然后你的主脚本可以从这些地方读取数据。

当然,如果你传递其他类型的对象(除了 None 或整数)给 sys.exit(),它会把这个对象转成字符串写入 sys.stderr,但在这种情况下,退出代码会被设置为 1;你就无法控制退出状态了。最好是在明确写入输出流后,手动设置退出状态。

你只需要使用 subprocess.Popen() 对象,把 stdoutstderr 设置为 subprocess.PIPE,然后使用 Popen.communicate() 方法 从这个管道流中读取数据:

proc = subprocess.Popen([executable, arg1, arg2],
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()
status_code = proc.returncode

撰写回答