2015-07-30 2 views
0

Я действительно пытаюсь понять, как передать переменные из сценария bash в функцию python, которую я создал. Я просмотрел несколько статей по одной и той же проблеме и, похоже, не понимаю, чего мне не хватает.Передать переменную функции python из сценария bash

У меня есть функция питон скрипт с именем fname_function.py:

from glob import glob 
import os 
import sys 

first_arg=sys.argv[1] 
second_arg=sys.argv[2] 
third_arg=sys.argv[3] 

def gFpath(reach,drive,date): 
    list1 = glob(os.path.normpath(os.path.join(drive, reach, date,'*'))) 
    list2 =[] 
    for afolder in list1: 
     list2.append(glob(os.path.normpath(os.path.join(drive, reach, date, afolder, 'x_y_class?.asc')))) 
    return list2 

if __name__=='__main__': 
    gFpath(first_arg,second_arg,third_arg) 

И мой Баш скрипт выглядит следующим образом:

reach="R4a" 
drive= "D:\\" 
dte="2015_04" 

fnames=$(python fname_function.py "$reach" "$drive" "$dte") 

for fname in $fnames; do echo "Script returned $fname"; done 

Переменные передается в сценарий Python, но я не могу показаться, чтобы получить list2 обратно в мой сценарий оболочки.

Спасибо,

Dubbbdan

ответ

2

Вы можете просто запустить файл Python непосредственно, как python fname_function.py "$reach" "$drive" "$dte"

Однако sys.argv[0] будет в этом случае fname_function.py, так что вы хотите установить first_arg в sys.argv[1] и увеличивайте и другие числа.

Кроме того, вы ничего не выводите в своем сценарии на Python. Вы должны сделать конец вашего сценария следующим образом:

if __name__=='__main__': 
    fnames = gFpath(first_arg,second_arg,third_arg) 
    for fname in fnames: 
     print(fname) 

, который напечатает 1 результат от gFpath на каждой строке.

+0

'gFpath' был разработан для возврата списка путей к файлу сценария bash. Как я могу получить доступ к 'list2' из сценария оболочки? – dubbbdan

+1

Вы можете назначить вывод переменной в bash следующим образом: 'fnames = $ (python fname_function.py" $ reach "" $ drive "" $ dte ")'. Затем вы можете перебрать их с помощью 'for fname в $ fnames; do echo "Сценарий возвратил $ fname"; done'. Это может испортиться, если в именах файлов есть пробелы, но я не могу проверить на bash прямо сейчас. – iobender

+0

Большое спасибо за помощь! Как бы то ни было, когда я реализую предложение 'fname = ...', я получаю 'gfnames.sh: строка 4: D: \: это каталог' Я намеренно делал его каталогом, который я мог изменить, когда я работаю на разных дисках , Любые идеи о том, как передать переменную, похожую на каталог? – dubbbdan

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