从bash发送参数到python

时间:2018-10-03 08:59:13

标签: python bash parameters split

我有一个bash脚本,该脚本使用参数调用python脚本。 在bash脚本中,我正在读取一个文件,该文件包含用“,”分隔的一行参数,然后使用我所读取的行调用python脚本。 我的问题是python获取的参数由空格分隔。

该行如下所示:“ param_a”“ Param B”“ Param C” 代码示例:

Bash脚本:

LINE=`cat $tmp_file`
id=`python /full_path/script.py $LINE`

Python脚本:

print sys.argv[1]
print sys.argv[2]
print sys.argv[3]

收到的输出:

"param_a"
"Param 
B"

想要的输出:

param_a
Param B
Param C

如何将参数发送到所需的Python脚本中? 谢谢!

3 个答案:

答案 0 :(得分:1)

id=`python /full_path/script.py $tmp_file`

import sys
for line in open(sys.argv[1]):
    print(line)

答案 1 :(得分:1)

问题在于bash如何传递参数。 Python与它无关。

因此,您必须先解决所有这些问题,然后再将其发送给Python,我决定为此使用awk和xargs。 (但是xargs是这里的实际MVP。)

LINE=$(cat $tmp_file) 
awk -v ORS="\0" -v FPAT='"[^"]+"' '{for (i=1;i<=NF;i++){print substr($i,2,length($i)-2)}}' <<<$LINE | 
xargs -0 python ./script.py

第一个$(..)优于反引号,因为它更具可读性。毕竟,您正在制作一个变量。

awk仅从stdin或文件中读取,但是您可以使用<<<(也称为“此处为字符串”)强制其从变量中读取。

使用awk循环遍历所有字段(由FPAT变量中的正则表达式定义),并打印不带“”的字段。

我选择的输出记录分隔符是NULL字符(-v ORF ='\ 0'),xargs将在此字符上分割。

xargs现在将通过将参数分隔为NULL字符(用-0设置)来解析管道输入,并执行使用已解析参数给出的命令。

注意,虽然在大多数UNIX系统上都可以找到awk,但我使用的是FPAT,它是GNU awk扩展名,您可能没有将GNU awk作为默认值(例如Ubuntu),但是gnu awk通常只是一个{{ 1}}。

此外,下一条命令将是一种快速简便的解决方案,但通常被认为是不安全的,因为install gawk将执行接收到的所有指令。

eval

答案 2 :(得分:1)

这可以使用bash数组来完成:

tmp_file='gash.txt'

# Set IFS to " which splits on double quotes and removes them
# Using read is preferable to using the external program cat
# read -a reads into the array called "line"
# UPPERCASE variable names are discouraged because of collisions with bash variables
IFS=\" read -ra line < "$tmp_file"

# That leaves blank and space elements in "line", 
# we create a new array called "params" without those elements
declare -a params
for((i=0; i < ${#line[@]}; i++))
do
    p="${line[i]}"
    if [[ -n "$p" && "$p" != " " ]]
    then
        params+=("$p")
    fi
done

# `backticks` are frowned upon because of poor readability
# I've called the python script "gash.py"
id=$(python ./gash.py "${params[@]}")
echo "$id"

gash.py

import sys

print "1",sys.argv[1]
print "2",sys.argv[2]
print "3",sys.argv[3]

礼物:

1 param_a
2 Param B
3 Param C