如何将Linux命令的输出传递给Python脚本?
我们有一个Python脚本,它接受以下参数作为示例:
mypie.py --size=20 --pielist='{"apple":[5],"orange":[7]}' --quantity=10
我们在我们的test.sh这个bash脚本中尝试了:
test.sh 20 5 7 10
test.sh
export SIZE=$1
export APPLE=$2
export ORANGE=$3
export QUANTITY=$4
echo "--size=$SIZE" --pipelist='{\"apple\":[$2],\"orange\":[$3]}\"' --quantity=$4" | tee output.txt
cat output.txt | sudo python mypie.py
结果出现了错误:
错误:没有指定大小。
但是当我们查看output.txt时,可以看到里面有大小的值。
--size=20 --pielist='{"apple":[5],"orange":[7]}' --quantity=10
我们哪里做错了呢?
谢谢!
4 个回答
1
你可以使用命令替换的方式,把命令的输出直接作为参数传给你的Python程序。
python mypie.py `cat output.txt`
或者
python mypie.py $(cat output.txt)
1
简单明了的解决办法就是修改 test.sh
文件,让它正确地传递参数。
#!/bin/sh
set -x # if you want to see the script's parameters
sudo python mypie.py --size="$1" \
--pipelist="{'apple':[$2],'orange':[$3]}" --quantity="$4"
把参数当作标准输入来传递(这就是管道的作用)其实并不是常见的做法,也不太适合这种特定的交互方式。
3
使用管道可以把内容传递给程序的标准输入,而不是直接在命令行上显示。
你可以考虑先创建一个叫做 args 的变量,然后把这个变量同时传递给 output.txt 文件和你的 Python 脚本。
比如:
export SIZE=$1
export APPLE=$2
export ORANGE=$3
export QUANTITY=$4
export ARGS="--size=$SIZE" --pipelist='{\"apple\":[$2],\"orange\":[$3]}\"' --quantity=$4"
echo $ARGS | tee output.txt
sudo python mypie.py $ARGS
3
这个命令可以这样理解 -
cat output.txt | sudo xargs python mypie.py
这里的意思是:首先用`cat output.txt`这个命令来查看`output.txt`文件里的内容,然后把这些内容通过管道(`|`)传递给后面的命令。接着,`sudo xargs python mypie.py`会把这些内容作为参数传给`mypie.py`这个Python程序去执行。`sudo`是用来提升权限的,确保你有足够的权限去运行这个程序。