Как передать переменные из 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: Я действительно хотел сказать "корочка"
Ответы
Ответ 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