如何将变量从python脚本传递给bash脚本

时间:2010-11-23 14:38:52

标签: python bash variables

我有一个bash脚本,a.sh,在其中我调用了一个python脚本b.py. python脚本计算一些东西,我希望它返回一个稍后将在a.sh中使用的值。 我知道我可以做到

在a.sh中:

var=`python b.py`

在b.py中:

print x # when x is the value I want to pass

但这不太方便,因为我还在b.py中打印其他消息

有没有更好的方法呢?

修改

我现在正在做的只是

var=`python b.py | tail -n 1`

这意味着我可以在b.py中打印很多东西,但只有最后一行(最后一个打印命令,假设它中不包含“\ n”)将存储在var中。

感谢所有答案!

7 个答案:

答案 0 :(得分:8)

我会将它打印到命令行中选择的文件中,然后我会使用类似cat的内容在bash中获取该值。

所以你去了:

python b.py tempfile.txt
var=`cat tempfile.txt`
rm tempfile.txt

[编辑,基于其他答案的另一个想法]

您的另一个选择是仔细格式化输出,以便您可以使用head / tail之类的bash函数将第一行/最后一行输送到下一个程序。

答案 1 :(得分:3)

我相信答案是

的.py

import sys 
a=['zero','one','two','three'] 
b = int(sys.argv[1]) 
###your python script can still print to stderr if it likes to 
print >> sys.stderr, "I am no converting" 
result = a[b] 
print result

.SH

#!/bin/sh 

num=2 
text=`python numtotext.py $num` 
echo "$num as text is $text" 

答案 2 :(得分:1)

我不确定“更好”,但是可以将结果写入文件,然后在Bash中重新读取并在之后将其删除。

这绝对是丑陋的,但是如果没有别的办法,请记住这一点。

答案 3 :(得分:1)

在你的python脚本中,将另一条消息重定向到stderr,并将x打印到stdout:

import sys
...
print >>sys.stderr, "another message"
print x
bash脚本中的

...
var=`python b.py 2>/dev/null`

此外,如果x是0,255之间的整数,您可以使用退出代码将其传递给bash:

import sys
...
sys.exit(x)
bash中的

python b.py
var=$?

请注意,退出代码用于表示错误,0表示没有错误,这违反了惯例。

答案 4 :(得分:1)

关于bash def __GenerateBitmaps__(self): size = self.GetClientSizeTuple() Color = wx.SystemSettings.GetColour # This is a helper to shorten the text below. bcFace = Color(wx.SYS_COLOUR_3DFACE) bcLEdge = Color(wx.SYS_COLOUR_3DLIGHT) bcDEdge = Color(wx.SYS_COLOUR_3DSHADOW) self.__activebitmap__ = wx.EmptyBitmap(size[0], size[1]) self.__greyedbitmap__ = wx.EmptyBitmap(size[0], size[1]) self.__pressedbitmap__ = wx.EmptyBitmap(size[0], size[1]) self.__sensitivity__ = wx.EmptyBitmap(size[0], size[1]) memdc = wx.MemoryDC() maskbitmap = wx.EmptyBitmap(size[0], size[1], depth = 1) memdc.SelectObject(maskbitmap) memdc.SetBackground(wx.WHITE_BRUSH) memdc.Clear() self.__GenerateTriangle__(memdc, (0, 0, size[0], size[1]), wx.BLACK, wx.BLACK, wx.BLACK) memdc.SelectObject(wx.NullBitmap) abmmask = wx.Mask(maskbitmap) # <--- gbmmask = wx.Mask(maskbitmap) # <--- New code to make multiple masks. pbmmask = wx.Mask(maskbitmap) # <--- memdc.SelectObject(self.__sensitivity__) self.__GenerateTriangle__(memdc, (0, 0, size[0], size[1]), wx.RED, wx.RED, None) memdc.SelectObject(self.__activebitmap__) self.__GenerateTriangle__(memdc, (0, 0, size[0], size[1]), bcFace, bcLEdge, bcDEdge) memdc.SelectObject(self.__greyedbitmap__) self.__GenerateTriangle__(memdc, (0, 0, size[0], size[1]), bcFace, bcLEdge, None) memdc.SelectObject(self.__pressedbitmap__) self.__GenerateTriangle__(memdc, (0, 0, size[0], size[1]), bcFace, bcDEdge, bcLEdge) memdc.SelectObject(wx.NullBitmap) self.__activebitmap__.SetMask(abmmask) # <--- self.__greyedbitmap__.SetMask(gbmmask) # <--- Code edited to apply new masks. self.__pressedbitmap__.SetMask(pbmmask) # <---

我通常会做类似

的事情
{{1}}

答案 5 :(得分:0)

您可以将输出写入临时文件,并让shell读取并删除该文件。这甚至不太方便,但保留了与用户沟通的标准。

或者,您可以为stdout使用某种格式:前n行是某些变量,其余的将由父shell回显给用户。也不方便,但避免使用临时文件。

答案 6 :(得分:0)

在shell脚本中,您可以像这样python_ret=$(python b.py)使用。 它包含来自python文件b.py的所有打印消息。然后,您可以搜索要查找的字符串。例如,如果您正在寻找“例外”,则可以撒谎

if [[ $python_ret == *"Exception:"* ]]; then
    echo "Got some exception."
    exit 1
fi