我有一个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中。
感谢所有答案!
答案 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