从shell调用python函数并只获取返回的值

时间:2018-02-09 18:41:44

标签: python shell

如何从函数中获取返回的值,在下面的示例中,我希望在bash shell中只获取foorbar而不是this is a test

$ cat foo.py
print "this is a test"
def bar():
    return "foobar"

$ output=$(python -c 'import foo;print foo.bar()')
$ echo $output
this is a test foobar

3 个答案:

答案 0 :(得分:2)

我建议,如果您因print "this is a test"部分的原因需要,请检查文件是否正在自行运行,例如检查__name__属性,如下所示:

<强> foo.py:

def bar():
    return "foobar"

if __name__ == "__main__":
    print("this is a test")

这应该意味着唯一的时间&#34; 这是一个测试&#34;打印是在您调用python foo.py时,而不是在foo作为模块导入时。 希望这有帮助!

答案 1 :(得分:1)

如果您希望保持模块原样并获得所需内容,则需要通过暂时将STDOUT重定向到其他位置来抑制正在打印的模块级别字符串(例如None/dev/null或任何其他文件描述符作为转储区域),并在import完成后再次复制到原始STDOUT。

% cat spam.py
print("this is a test")
def bar():
    return "foobar"

% python3 -c 'import sys;sys.stdout=None;import spam;sys.stdout=sys.__stdout__;print(spam.bar())'
foobar

% out=$(python3 -c 'import sys;sys.stdout=None;import spam;sys.stdout=sys.__stdout__;print(spam.bar())')

% echo "$out"
foobar

扩展形式:

import sys
sys.stdout = None
import spam
sys.stdout = sys.__stdout__
print(spam.bar())

答案 2 :(得分:0)

在特定情况下,所需输出是python stdout的最后一行,您可以使用tail

output=$(python -c 'import foo;print foo.bar()' | tail -1)