不理解python中的返回行为

不理解python中的返回行为,python,Python,我只是在尝试一个简单的代码: import sys def main(): print "this is main" return "string1" if __name__ == "__main__": sys.exit(main()) 当我运行这段代码时,它会给出随机结果,有时在“this is main”之前出现“string1”,有时在它之后出现 为什么会这样 2个样本输出: 这是主要的 strin

我只是在尝试一个简单的代码:

import sys

def main():
    print "this is main"
    return "string1"

if __name__ == "__main__":
    sys.exit(main())
当我运行这段代码时,它会给出随机结果,有时在“this is main”之前出现“string1”,有时在它之后出现

为什么会这样

2个样本输出:

这是主要的

string1

进程已完成,退出代码为1

============

string1

这是主要的

进程已完成,退出代码为1


sys.exit
获取
main()
的返回值,并将其作为应用程序的错误代码生成。值通常应该是数字,尽管Python在这里有点棘手

根据以下文件:

如果传递了另一种类型的对象,则“无”与“传递”等价 零,任何其他对象打印到stderr并导致退出 代码为1。特别是,sys.exit(“一些错误消息”)是一个快速解决方案 发生错误时退出程序的方法

因此,可能发生的是
stdout
(用于
print
)的刷新与上述
stderr
的输出之间的竞争


我建议您尝试在
打印后刷新
stdout
sys.stdout.flush
),然后查看是否以这种方式获得一致的输出。

这是如何打印的?为什么
sys.exit()
会将字符串作为参数?@cricket_007请参阅
sys.exit
@timarko的文档-我的问题是针对OP的,并不是说我对OP缺乏了解完整的答案将取决于问题中未提及的几个因素:您使用的是什么操作系统,您是如何运行程序的,标准输出和标准错误被引导到哪里(尽管最后一个问题的答案似乎是终端)。所有这些都会影响标准输出和标准错误的缓冲方式(如果有的话)。@chepner,我使用的是win64操作系统。是的,看起来stdout和stderr缓冲是导致这种行为的原因。请参阅
sys.exit
@EliBendersky的文档,谢谢。我明白了这种行为背后的道理。我在print语句之后尝试了sys.stdout.flush(),但仍然是相同的行为。@pratekgoyal:我建议不要依赖不同流的缓冲顺序。不要将字符串传递给
sys.exit