从Python脚本中返回值的最佳方法

83

我用Python写了一个脚本,它会取几个文件,运行几个测试,并计算出所有total_bugs的数量,同时为每个文件编写包含信息(bugs + more)的新文件。

要从当前工作目录中提取一些文件:

myscript.py -i input_name1 input_name2

当任务完成时,我希望脚本“返回total_bugs”,但我不确定最佳实现方式。

目前,该脚本会输出以下内容:

[working directory]
[files being opened]
[completed work for file a + num_of_bugs_for_a]
[completed work for file b + num_of_bugs_for_b]
...
[work complete]

这里可能需要一些帮助(注释/提示/代码示例)。

顺便提一句,这需要在 Windows 和 Unix 上运行。


8
尝试使用可执行文件的返回值来返回除错误代码或成功的0以外的任何内容通常都不是一个好主意。当返回该值时,你打算用它做什么呢? - Wooble
1
不清楚 Windows,但在 Linux 中,程序通常将结果输出到标准输出(stdout)。似乎你的脚本通常会打印大量信息,但也许使用不同的标志(可能是 c 表示计数),它只打印文件的总数,例如:myscript.py -c -i input_name1 input_name2。 - arghbleargh
@ Wooble 是一个用于查找报告文件中错误的脚本。该值可用于评估报告文件的编写质量。 - ofer.sheffer
@arghbleargh,我决定使用额外的错误报告文件,但是取决于我的主管决定,我可能会将其更改为类似您建议的内容。谢谢。 - ofer.sheffer
1个回答

142

如果您想让脚本返回值,只需从包装代码的函数中执行return [1,2,3],但这样一来,您必须从另一个脚本导入您的脚本,才能对该信息进行任何有意义的使用:

返回值(来自包装函数)

(同样,这必须由单独的Python脚本运行并导入,才能发挥任何作用):

import ...
def main():
    # calculate stuff
    return [1,2,3]

退出码作为指示器

(这通常只适用于当您想向管理员指示出了什么问题或仅需要计算错误/行数或其他内容时。通常,0是良好的退出值,而>= 1是不良退出值,但您可以按任何方式解释它们以获取数据)

import sys
# calculate and stuff
sys.exit(100)

根据你想要告诉你的管理者的信息,使用特定的退出代码退出。当通过计划和监控环境运行脚本时,我使用退出代码来指示发生了什么。

(os._exit(100)也可以使用,且更加强制)

使用标准输出作为中继

如果没有,您必须使用stdout与外界通信(就像您所描述的那样)。但这通常是个坏主意,除非是解析器执行您的脚本并且能够捕获您报告的任何信息。

import sys
# calculate stuff
sys.stdout.write('Bugs: 5|Other: 10\n')
sys.stdout.flush()
sys.exit(0)

如果您正在受控的调度环境中运行脚本,那么退出代码是最好的选择。

文件作为传输介质

还有一种选项,就是将信息简单地写入文件并在那里存储结果。

# calculate
with open('finish.txt', 'wb') as fh:
    fh.write(str(5)+'\n')

从那里获取价值/结果。您甚至可以以CSV格式进行操作,以便供他人简洁阅读。

套接字作为传送带

如果上述方法均不起作用,则还可以在本地使用网络套接字(*在nix系统上,Unix套接字是一个很好的选择)。这些有点复杂,值得拥有它们自己的帖子/答案。但是编辑并将其添加到此处,因为它是在进程之间通信的良好选择。特别是如果它们应该运行多个任务并返回值。


2
这不是我写的,但我认为建议使用os._exit()而不是sys.exit()。请参阅http://docs.python.org/2/library/os.html#os._exit。 - rodion
好的,我只是习惯在我的线程应用程序中经常写"_exit()",所以认为这不是什么大问题:S - Torxed
4
或许建议使用退出代码来传达除成功或少数失败指示以外的任何内容。 - msw
1
即使脚本被导入,你也不能从脚本中使用 return - Wooble
2
@Wooble 当然不是,但是这个想法...算了,人们太追求完美了,不会让我用伪代码和一般性的想法逃脱。我会更具体的 -.- - Torxed
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接