79

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

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

sys.exit(myString) 

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

outputString=`python myPythonScript arg1 arg2 arg3 `

但是当我检查 with 的值时outputStringecho $outputString我得到了 Python 脚本打印到屏幕上的所有内容,但没有返回值myString

我该怎么做?

编辑:我需要字符串,因为它告诉我 Python 脚本创建的文件的位置。我想做类似的事情:

fileLocation=`python myPythonScript1 arg1 arg2 arg1`
python myPythonScript2 $fileLocation
4

6 回答 6

62

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

如果要捕获写入 stderr 的输出,可以执行类似的操作

python yourscript 2> return_file

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

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

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

例子:

测试.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)
于 2012-08-10T11:41:02.780 回答
26

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

sys.exit(1)

1$?.

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

编辑:

如果要写入 stderr,请使用sys.stderr.

于 2012-08-10T11:37:37.717 回答
9

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

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

于 2012-08-10T12:35:00.863 回答
8

文档中阅读它。如果您返回除intor以外的任何内容None,它将被打印到stderr.

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

output=$(python foo.py 2>&1 >/dev/null)
于 2012-08-10T11:55:05.677 回答
4

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

outputString=$(python myPythonScript arg1 arg2 arg3)
于 2012-08-10T11:37:48.937 回答
4

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

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

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

无论如何,如果您将字符串作为 arg 放入 sys.exit() 中,它应该在程序输出的末尾打印在单独的行中,以便您只需稍作解析即可检索它。作为一个例子考虑这个:

outputString=`python myPythonScript arg1 arg2 arg3 | tail -0`
于 2012-08-10T11:49:03.110 回答