在bash脚本中存储Python脚本的返回值

时间:2012-08-10 11:35:36

标签: python bash return return-value

我想从bash脚本执行python脚本,我想将python脚本的输出存储在变量中。

在我的python脚本中,我将一些内容打印到屏幕上,最后我返回一个字符串:

sys.exit(myString) 

在我的bash脚本中,我执行了以下操作:

outputString=`python myPythonScript arg1 arg2 arg3 `

但是当我用outputString检查echo $outputString的值时,我得到了Python脚本打印到屏幕的所有内容,但返回值{{1} }!

我该怎么做?

编辑:我需要字符串,因为它告诉我Python脚本创建的文件位于何处。我想做点什么:

myString

7 个答案:

答案 0 :(得分:35)

sys.exit(myString)并不意味着“返回此字符串”。如果将字符串传递给sys.exitsys.exit会将该字符串视为错误消息,并将该字符串写入stderr。与整个程序的返回值最接近的概念是exit status,它必须是整数。

如果要捕获写入stderr的输出,you can do something like

python yourscript 2> return_file

您可以在bash脚本中执行类似的操作

output=$((your command here) 2> &1)

但不保证仅捕获传递给sys.exit的值。还将捕获写入stderr的任何其他内容,其中可能包括日志记录输出或堆栈跟踪。

示例:

test.py

print "something"
exit('ohoh') 

t.sh

va=$(python test.py 2>&1)                                                                                                                    
mkdir $va

bash t.sh

修改

不确定为什么,但在那种情况下,我会编写一个主脚本和另外两个脚本...混合python和bash是没有意义的,除非你真的需要。

import script1
import script2

if __name__ == '__main__':
    filename = script1.run(sys.args)
    script2.run(filename)

答案 1 :(得分:20)

sys.exit()应返回一个整数,而不是字符串:

sys.exit(1)

1位于$?

$ cat e.py
import sys
sys.exit(1)
$ python e.py
$ echo $?
1

修改

如果您想写入stderr,请使用sys.stderr

答案 2 :(得分:7)

不要像这样使用sys.exit。使用字符串参数调用时,进程的退出代码将为1,表示错误情况。打印字符串为标准错误,以指示错误可能是什么。 sys.exit不得用于为您的脚本提供“返回值”。

相反,您应该使用print语句将“返回值”打印到标准输出,然后调用sys.exit(0),并捕获shell中的输出。

答案 3 :(得分:5)

docs中阅读。 如果您返回intNone以外的任何内容,则会将其打印到stderr

在丢弃标准输出时获取stderr:

output=$(python foo.py 2>&1 >/dev/null)

答案 4 :(得分:1)

sys.exit([arg])的Python文档说:

  

可选参数arg可以是一个整数,给出退出状态(默认为零)或其他类型的对象。如果它是整数,则零被认为是“成功终止”,并且任何非零值被贝壳等视为“异常终止”。大多数系统要求它在0-127范围内,否则会产生不确定的结果。

此外,要检索上次执行的程序的返回值,您可以使用$? bash预定义变量。

无论如何,如果你把一个字符串作为arg放在sys.exit()中,它应该在一个单独的行中打印在程序输出的末尾,这样你只需要进行一些解析就可以检索它。举个例子考虑一下:

outputString=`python myPythonScript arg1 arg2 arg3 | tail -0`

答案 5 :(得分:0)

除了Tichodroma所说的,你可能最终会使用这种语法:

outputString=$(python myPythonScript arg1 arg2 arg3)

答案 6 :(得分:0)

你回答了自己的问题。如果要从bash运行Python脚本并将输出存储在bash变量中,请选择Python脚本打印的内容。

制作一个"详细"标记您可以在Python脚本中关闭以禁止您不希望存储在bash变量中的额外文本。不要参与将有效输出写入stderr或覆盖退出代码! (那是坏孩子做的......)

尝试这样的事情:

fileLocation=`python myPythonScript1 arg1 arg2 arg1 --verbose off`