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

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)

  • `>`是一个重定向运算符.`2>`重定向错误消息,`>`是stdout`<`是stdin (3认同)

小智 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.

  • Shell脚本可以使用`$?`来检查前一个命令是否正常运行,或者是否有错误。退出代码是Un * x环境中程序进行通信的基本方式。 (2认同)

Alp*_*Alp 8

除了 Tichodroma 所说的之外,您最终可能会使用以下语法:

outputString=$(python myPythonScript arg1 arg2 arg3)
Run Code Online (Sandbox Code Playgroud)


che*_*ner 7

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

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


The*_*eke 5

文档中阅读它.如果你返回任何东西,int或者None它将被打印到stderr.

要在丢弃标准输出时获得stderr,请执行以下操作:

output=$(python foo.py 2>&1 >/dev/null)
Run Code Online (Sandbox Code Playgroud)