我想从bash脚本执行python脚本,我想将python脚本的输出存储在变量中。
在我的python脚本中,我将一些内容打印到屏幕上,最后我返回一个字符串:
sys.exit(myString)
在我的bash脚本中,我执行了以下操作:
outputString=`python myPythonScript arg1 arg2 arg3 `
但是当我用outputString
检查echo $outputString
的值时,我得到了Python脚本打印到屏幕的所有内容,但不返回值{{1} }!
我该怎么做?
编辑:我需要字符串,因为它告诉我Python脚本创建的文件位于何处。我想做点什么:
myString
答案 0 :(得分:35)
sys.exit(myString)
并不意味着“返回此字符串”。如果将字符串传递给sys.exit
,sys.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中阅读。
如果您返回int
或None
以外的任何内容,则会将其打印到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`