使用Python函数返回值给shell变量赋值

12

我有一个Python函数fooPy(),它返回一些值(int / double或字符串)。

我想在shell脚本中使用这个值并将其赋值。例如,以下是Python函数:

def fooPy():
    return "some string" 
    #return 10  .. alternatively, it can be an int

fooPy()

在 shell 脚本中,我尝试了以下几件事情,但它们都没有起作用。

fooShell = python fooPy.py
#fooShell = $(python fooPy.py)
#fooShell = echo "$(python fooPy.py)"
4个回答

34
你可以在Python中这样打印你的值:
print fooPy()

在您的shell脚本中:

fooShell=$(python fooPy.py)

确保在shell脚本中=周围没有留空格。


1
谢谢,那个起作用了!我还犯了一个错误,在等号周围放了空格。所以我也修复了它。 - cppb
+1 提醒大家在 shell 脚本中不要在等号周围留空格,这会让像我这样的新手感到非常烦恼。 - Matt Bannert

11

在你的Python代码中,你需要打印出结果。

import sys
def fooPy():
    return 10 # or whatever

if __name__ == '__main__':
    sys.stdout.write("%s\n", fooPy())

然后在终端中,您可以执行:

fooShell=$(python fooPy.py) # note no space around the '='

请注意,我在Python代码中添加了一个 if __name__ == '__main__' 检查,以确保仅在从命令行运行程序时才进行打印,而不是在从Python解释器导入它时进行打印。

另外,我使用了 sys.stdout.write() 而不是 print,因为:

  • print 在 Python 2 和 Python 3 中具有不同的行为,
  • 在“真实程序”中,应该始终使用 sys.stdout.write() 而不是 print :-)

  • 1 表示需要详细解释关于 sys.stdout.write() 函数的备注,因为它非常有用。谢谢!
- cppb
太棒了。正是我在寻找的。 - Runcy Oommen

5
如果你想获取Python sys.exit语句的值,它将存储在shell特殊变量$?中。
$ var=$(foo.py)
$ returnval=$?
$ echo $var
Some string
$ echo returnval
10

+1 指引如何获取终止代码...但让我修复一个小细节。 - fortran
感谢您的修复(这就是在多种语言中工作的风险)。 - Dennis Williamson
嗯,这使得“print return_val”调用变得不必要(尚未尝试)。谢谢,这是有用的信息。+1。 - cppb
感谢提到 sys.exit() / $? 的关联。这正是我在寻找的。 - Noich

3

你应该打印fooPy返回的值。Shell替换从stdout读取。将你的程序的最后一行替换为print fooPy(),然后使用你提到的第二个shell管道。这样就可以工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接