Подтвердить что ты не робот

Как передать переменные из bash script в python script

Я пытаюсь решить эту проблему на некоторое время без везения. Корень ситуации заключается в том, что я использую bash script для отправки параметров на python script:

Пример:

foo.sh вызывает bar.py.... вызов выглядит так: bar.py $var1 $var2... $varn

Затем python script распечатывает все аргументы с помощью массива sys.argv. Python script корректно работает из командной строки, но при вызове с bash script (i.e foo.sh) я не получаю вывод из bar.py.

Кроме того, я начал foo.sh с помощью опции "#!/bin/ bash -x" и также просмотрел вывод.

Подводя итог:

  • Два скрипта, foo.sh и bar.py
  • foo.sh вызывает bar.py, передавая переменные foo.sh в качестве аргументов bar.py
  • bar.py печатает аргументы, которые он видит, используя sys.argv
  • bar.py работает при запуске из собственного терминала, не работает при вызове из foo.sh

Любая помощь будет потрясающей!!!!

Спасибо!

Изменить: Привет всем, спасибо за ответы, полный код довольно длинный... но... содержимое двух скриптов можно было бы суммировать

foo.sh ____

#!/bin/bash
declare -a list1;  
declare -a list2;  

list1=("foo" "bar" "please");  
list2=("foo" "bar" "please" "help");  

declare -a joined;  

joined=( $(bar.py "${list1[@]}" "${list2[@]}" ) );

bar.py ____

#!/bin/python
import sys  

for arg in sys.argv:  
    print arg  

Как я предполагаю, все отступы в python верны (не знаете, как StackOverflow делает это еще:)). Эти два являются ядром проблемы, с которой я сталкиваюсь. Как указано, bar.py правильно печатает аргументы, когда он не вызывается из foo.sh.

PS: Я действительно хотел сказать "корочка"

4b9b3361

Ответ 1

Изменить, поскольку код опубликован

Ваш код делает правильную вещь, за исключением того, что вывод из вашего bar.py script записывается в массив joined. Поскольку, похоже, вы не распечатываете содержимое joined, вы никогда не видите никакого вывода.

Здесь демонстрация:

Файл pybash.sh

#!/bin/bash

declare -a list1
declare -a list2

list1=("Hello" "there" "honey")
list2=("More" "strings" "here")

declare -a joined

joined=($(./pytest.py ${list1[@]} ${list2[@]}))
echo ${joined[@]}

Файл pytest.py

#!/usr/bin/python

import sys

for i in sys.argv:
    print "hi"

Это выведет пучок строк "привет", если вы запустите bash script.

Ответ 2

ИЗМЕНИТЬ:

Я понял это, у меня было какое-то переплетение персонажей, линия не была должным образом экранирована. Я изменил его с

var = ($ (некоторые команды))

to

var = (некоторые команды)//использование backticks (все еще изучает редактор SO...)

Bash побег - это какая-то поездка! Тем, кто ответил, спасибо за вашу помощь

Ответ 3

У меня есть довольно точная настройка, которую вы описываете, и вот как выглядит мой bash script:

VAR1=...
VAR2=...
VAR3=...

python my_script.py $VAR1 $VAR2 $VAR3