如何从函数中获取仅返回的值,在下面的示例中,我希望在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
答案 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)