从 python 脚本返回值的最佳方法
Posted
技术标签:
【中文标题】从 python 脚本返回值的最佳方法【英文标题】:Best way to return a value from a python script 【发布时间】:2013-08-16 09:17:04 【问题描述】:我在 python 中编写了一个脚本,它需要一些文件,运行一些测试并计算 total_bugs 的数量,同时编写包含每个文件信息的新文件(错误+更多)。
从当前工作目录获取几个文件:
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。
【问题讨论】:
尝试使用可执行文件的返回值返回除错误代码或 0 表示成功之外的任何内容通常是个坏主意。当它返回时,你打算如何处理这个值? 不了解windows,但在linux中程序将结果输出到stdout是很常见的。看起来您的脚本通常会打印一堆信息,但可能使用不同的标志(可能 c 表示计数?),它只打印文件的总数,例如myscript.py -c -i input_name1 input_name2 @Wooble,它是一个用于在报告文件中查找错误的脚本。该值允许估计报告文件的编写情况。 @arghbleargh,我决定使用额外的错误报告文件,但是,在我的主管决定之前,我可能会将其更改为类似于您的建议的内容。谢谢。 【参考方案1】:如果您希望您的脚本返回值,只需从包装您的代码的函数中执行return [1,2,3]
,但是您必须从另一个脚本导入您的脚本才能使用它资料:
返回值(来自包装函数)
(同样,这必须由单独的 Python 脚本运行并导入才能发挥作用):
import ...
def main():
# calculate stuff
return [1,2,3]
作为指标的退出代码
(这通常只适用于当您想向管理者指示出了什么问题或只是计数的错误/行数或 w/e。通常 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 格式进行操作,以供其他人简单阅读。
作为传送带的套接字
如果上述方法都不起作用,您也可以在本地使用网络套接字 *(unix 套接字是 nix 系统上的好方法)。这些有点复杂,应该有自己的帖子/答案。但是在此处编辑以添加它,因为它是进程之间通信的一个不错的选择。特别是如果他们应该运行多个任务并返回值。
【讨论】:
这不是来自我,但我想这是为了建议 os._exit() 而不是 sys.exit()。见docs.python.org/2/library/os.html#os._exit 好点,我只是习惯于在我的线程应用程序中多次写入_exit()
,我认为这没什么大不了的:S
或者也许建议使用退出代码来传达除成功或少数失败指示之外的任何内容。
您也不能从脚本中return
,即使它正在被导入。
@Wooble ofc 不是,但想法.. 没关系,人们太完美了,让我摆脱伪代码和关于事物的一般想法。我会更具体-.-以上是关于从 python 脚本返回值的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章