2016-05-19 3 views
1

У меня есть Баш скрипт, который считывает переменную из окружения, а затем передает его в сценарий питона, как этотBash передача строки аргумент питона сценария

#!/usr/bin/env bash 

if [ -n "${my_param}" ] 
then 
    my_param_str="--my_param ${my_param}" 
fi 

python -u my_script.py ${my_param_str} 

корреспондент питона сценария выглядеть следующим образом

parser = argparse.ArgumentParser(description='My script') 
parser.add_argument('--my_param', 
        type=str, 
        default='') 

parsed_args = parser.parse_args() 
print(parsed_args.description) 

Я хочу предоставить строку с тире символов «Some - string» в качестве аргумента, но она не работает через скрипт bash, но вызов непосредственно через командную строку работает нормально.

export my_param="Some -- string" 
./launch_my_script.sh 

выдает ошибку unrecognized arguments: -- string и python my_script.py --my_param "Some -- string" работает хорошо. Я попытался сыграть с nargs и избежать my_param_str="--my_param '${my_param}'" таким образом, но оба решения не помогли. Любое обходное решение для этого случая? Или другой подход, как справиться с этим?

+0

'--' обозначает конец аргументов для команды в обычном случае. – sjsam

+1

Вы должны ** всегда ** использовать двойные кавычки для расширений параметров Bash, если вы явно не хотите, чтобы Bash выполнял разбиение слов ... и вы, вероятно, не хотите разделить слово. :) См. [BashGuide] (http://mywiki.wooledge.org/BashGuide/Practices#Quoting) и [ShellCheck] (http://www.shellcheck.net). –

+0

Посмотрите на 'sys.argv', чтобы узнать, что' bash' дает ваш скрипт. 'argparse' может анализировать только строки в этом списке. – hpaulj

ответ

3

Ваш удар должен выглядеть следующим образом:

if [ -n "${my_param}" ] 
then 
    my_param_str="--my_param \"${my_param}\"" 
fi 

echo ${my_param_str}|xargs python -u my_script.py 

В противном случае кавычки вокруг строки параметров не будут сохранены, а «Некоторые», «-» и «вещь» будут переданы как три отдельных аргумента.

+0

Действительно хороший xargs-fu! Прекрасно работает с python argparse. – taranaki

1

Для ограниченного примера вы можете получить в основном такое же поведение, используя только

arg = os.environ.get('my_param', '') 

, где первым аргументом get является имя переменной, а второе значение по умолчанию используется если переменная не может быть в среде ,

+0

Спасибо, но я привязался к басу, передающему случай –

0

Кавычки вы пишете вокруг строки не получает сохранившуюся при назначении переменной Bash строки:

$ export my_param="Some -- string" 
$ echo $my_param 
Some -- string 

Вам нужно поместить кавычки вокруг переменной еще раз, когда вы используете его для создания my_param_str:

my_param_str="--my_param \"${my_param}\"" 
+0

Это не так. Это превратило бы 'my_param_str' в один аргумент формы' --my_param Some - string'. Кавычки должны быть вокруг 'Some-string'. –

+0

@Rawing В этом случае они должны быть записаны в этой строке: 'my_param_str =" - my_param \ "$ {my_param} \" "' –

Смежные вопросы