Отправить параметры в Python из Bash - PullRequest
0 голосов
/ 03 октября 2018

У меня есть скрипт bash, который вызывает скрипт Python с параметрами.В скрипте bash я читаю файл, содержащий одну строку параметров, разделенных символом ", а затем вызываю скрипт 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 голосов
/ 03 октября 2018

Проблема в том, как 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 читает только из стандартного ввода или файла, но вы можете заставить его читать переменную с помощью <<<, также называемой «здесь строкой».</p>

С помощью awk я перебираю все поля (как определено регулярным выражением в переменной FPAT) и печатаю их без "".

В качестве разделителя выходных записей я выбираю символ NULL (-v ORF = '\ 0'), xargs будет разделен на этот символ.

xargs теперь будет анализировать переданные по конвейеру входные данные путем разделения аргументов на символы NULL (установлено с -0) и выполнять команду, заданную с проанализированными аргументами.

Обратите внимание, что хотя awk встречается в большинстве систем UNIX, я использую FPAT, который является расширением GNU awk, и вы можете не использовать GNU awk по умолчанию (например, Ubuntu), но gnu awk обычно простоinstall gawk прочь

Кроме того, следующая команда будет быстрым и простым решением, но обычно считается небезопасным, поскольку eval выполнит все , которое она получит.

eval "python ./script "$LINE
0 голосов
/ 03 октября 2018

Это можно сделать с помощью 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
0 голосов
/ 03 октября 2018

А как насчет

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

и

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

?

...