Как передать переменные аргументы из скрипта bash в скрипт python - PullRequest
12 голосов
/ 18 октября 2010

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

Пример:

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

Затем скрипт python печатает все аргументы, используя массив sys.argv. Скрипт python корректно работает из командной строки, но при вызове из скрипта bash (т.е. 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  

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

PS: я хотел сказать "корочка"

Ответы [ 3 ]

6 голосов
/ 18 октября 2010

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

Ваш код работает правильно - за исключением того, что вывод из вашего скрипта bar.py записывается в массив 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"

Эта команда выведет несколько строк 'hi', если вы запустите скрипт bash.

1 голос
/ 19 октября 2010

РЕДАКТИРОВАТЬ:

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

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

на

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

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

0 голосов
/ 18 октября 2010

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

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

python my_script.py $VAR1 $VAR2 $VAR3 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...