Ric*_*son 53 python bash return return-value
我想从bash脚本执行一个python脚本,我想将python脚本的输出存储在一个变量中.
在我的python脚本中,我将一些东西打印到屏幕上,最后我返回一个字符串:
sys.exit(myString)
Run Code Online (Sandbox Code Playgroud)
在我的bash脚本中,我执行了以下操作:
outputString=`python myPythonScript arg1 arg2 arg3 `
Run Code Online (Sandbox Code Playgroud)
但是当我检查我的值时outputString,echo $outputString我将获得Python脚本打印到屏幕的所有内容,而不是返回值myString!
我该怎么做?
编辑:我需要字符串,因为它告诉我Python脚本创建的文件位于何处.我想做的事情如下:
fileLocation=`python myPythonScript1 arg1 arg2 arg1`
python myPythonScript2 $fileLocation
Run Code Online (Sandbox Code Playgroud)
Loï*_*oix 43
sys.exit(myString)并不意味着"返回此字符串".如果你传递一个字符串sys.exit,sys.exit将认为该字符串是一个错误消息,它将写入该字符串stderr.与整个程序的返回值最接近的概念是其退出状态,该状态必须是整数.
如果要捕获写入stderr的输出,可以执行类似的操作
python yourscript 2> return_file
Run Code Online (Sandbox Code Playgroud)
您可以在bash脚本中执行类似的操作
output=$((your command here) 2> &1)
Run Code Online (Sandbox Code Playgroud)
但是,不能保证仅捕获传递给的值sys.exit.还将捕获写入stderr的任何其他内容,其中可能包括日志记录输出或堆栈跟踪.
例:
test.py
print "something"
exit('ohoh')
Run Code Online (Sandbox Code Playgroud)
t.sh
va=$(python test.py 2>&1)
mkdir $va
Run Code Online (Sandbox Code Playgroud)
bash t.sh
编辑
不知道为什么,但在那种情况下,我会写一个主脚本和另外两个脚本...混合python和bash是没有意义的,除非你真的需要.
import script1
import script2
if __name__ == '__main__':
filename = script1.run(sys.args)
script2.run(filename)
Run Code Online (Sandbox Code Playgroud)
小智 20
sys.exit() 应该返回一个整数,而不是一个字符串:
sys.exit(1)
Run Code Online (Sandbox Code Playgroud)
值1是$?.
$ cat e.py
import sys
sys.exit(1)
$ python e.py
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)
编辑:
如果要写入stderr,请使用sys.stderr.
除了 Tichodroma 所说的之外,您最终可能会使用以下语法:
outputString=$(python myPythonScript arg1 arg2 arg3)
Run Code Online (Sandbox Code Playgroud)
不要这样使用sys.exit.使用字符串参数调用时,进程的退出代码将为1,表示错误情况.打印字符串为标准错误,以指示错误可能是什么.sys.exit不得用于为脚本提供"返回值".
相反,您应该使用print语句将"返回值"打印到标准输出,然后调用sys.exit(0),并捕获shell中的输出.
在文档中阅读它.如果你返回任何东西,int或者None它将被打印到stderr.
要在丢弃标准输出时获得stderr,请执行以下操作:
output=$(python foo.py 2>&1 >/dev/null)
Run Code Online (Sandbox Code Playgroud)