[英]How to pass variables from python script to bash script
我有一个 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 中。
感谢所有的答案!
我会将它打印到命令行中选择的文件,然后我会用像cat
这样的东西在bash中获得该值。
所以你去:
python b.py tempfile.txt
var=`cat tempfile.txt`
rm tempfile.txt
[编辑,基于其他答案的另一个想法]
您的另一个选择是仔细格式化您的输出,这样您就可以使用head
/ tail
等bash函数将第一行/最后一行输送到下一个程序。
我相信答案是
的.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"
在bash backsticks works
我通常会做类似的事情
PIP_PATH=`python -c "from distutils.sysconfig \
import get_python_lib; print(get_python_lib())"`
POWELINE_PATH=$PIP_PATH"/powerline"
echo $POWELINE_PATH
我不确定“更好”,但您可以将结果写入文件,然后在Bash中重新读取并在之后删除它。
这绝对是丑陋的,但要记住这一点,万一其他没有其他功能。
在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表示没有错误,这违反了约定。
您可以将输出写入临时文件,并让shell读取并删除该文件。 这甚至不太方便,但保留了与用户沟通的标准。
或者,您可以为stdout使用某种格式:前n行是某些变量,其余的将由父shell回显给用户。 也不方便,但避免使用临时文件。
在 shell 脚本中,您可以像这样使用python_ret=$(python b.py)
。 它包含来自 python 文件 b.py 的所有打印消息。 然后您可以搜索您要查找的字符串。 例如,如果您正在寻找“例外”,您可以这样
if [[ $python_ret == *"Exception:"* ]]; then
echo "Got some exception."
exit 1
fi
最好将打印值从 python 脚本转发到临时文件,然后再将其分配为 bash 值。 如果是这种情况,我相信没有必要删除文件。
!#/bin/bash
python b.py > tempfile.txt
var=`cat tempfile.txt`
然后,获取值:
echo $var
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.