我们可以将元组作为参数发送给sys.exit()吗?
我在使用 Python 2.6 运行我的脚本。下面是我的需求。
在一个文件夹里有大约 100 个测试脚本(都是 Python 脚本)。我需要创建一个主脚本,这个主脚本会一个接一个地运行这 100 个测试脚本,然后显示每个测试用例是否失败。每个脚本都会调用 sys.exit()
来结束执行。目前,我是从主脚本中读取 sys.exit()
的返回值,然后判断特定的测试用例是否失败。
但是现在需求变了,我还需要显示日志文件的名称(日志文件会在我运行脚本时创建)。所以我能不能把一个包含状态和日志文件名的元组作为参数传给 sys.exit()
,而不是传一个整数值呢?
我在网上看到,如果我们传递一个非整数的参数,None
相当于传递零,而其他任何对象都会被打印到 stderr
,并导致退出代码为 1。所以如果我传一个元组作为参数,os
会不会在成功的情况下也认为是失败,因为我没有传 None
呢?
我在主脚本中使用 subprocess.popen()
来运行这些脚本,并且使用 format()
来读取 sys.exit()
的值。
2 个回答
没错,你说得对。传递一个元组会把这个元组打印到错误输出(stderr)上,并且返回一个退出代码1。你必须返回None来表示成功。
注意,这是一种在命令行和类似环境中的约定,并不是强制要求的。不过,这些约定存在是有很好的理由的。
不,你不能这样做。sys.exit()
只是用来设置程序的退出代码,仅此而已。没有其他方式可以用这个代码做什么,除了把它设置为一个整数。
不过,你可以把数据写入 sys.stdout
或 sys.stderr
,然后你的主脚本可以从这些地方读取数据。
当然,如果你传递其他类型的对象(除了 None
或整数)给 sys.exit()
,它会把这个对象转成字符串写入 sys.stderr
,但在这种情况下,退出代码会被设置为 1
;你就无法控制退出状态了。最好是在明确写入输出流后,手动设置退出状态。
你只需要使用 subprocess.Popen()
对象,把 stdout
或 stderr
设置为 subprocess.PIPE
,然后使用 Popen.communicate()
方法 从这个管道流中读取数据:
proc = subprocess.Popen([executable, arg1, arg2],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()
status_code = proc.returncode