передача массива bash в список python

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

./crcFiles.sh: line 7: export: `0021': not a valid identifier Traceback (most recent call last): File "/shares/web/vm3618/optiload/prog/legalLitres.py", line 30, in <module> for i in mdcArray.split(' '): AttributeError: 'NoneType' object has no attribute 'split' 

может кто-то объяснить, почему $ mdcNo не переходит от bash к python успешно?

Код .sh:

 #!/bin/bash mdcNo=('0021' '0022' '0036' '0055' '0057' '0059' '0061' '0062' '0063' '0065' '0066' '0086' '0095' '0098' '0106' '0110' '0113' '0114' '0115' '0121' '0126' '0128' '0135' '0141' '0143' '0153' '0155' '0158') localDIR=/shares/web/vm3618/optiload/prog export mdcNo $localDIR/legalLitres.py for i in "${mdcNo[@]}" do echo $i cp $localDIR/MDC$i/*/QqTrkRec.txt $localDIR/crccalc/. cd $localDIR/crccalc ./crccalc.py QqTrkRec.txt cp $localDIR/crccalc/QqTrkRec.txt $localDIR/MDC$i/. done 

code .py:

 #!/usr/bin/python import glob import os mdcArray = os.getenv('mdcNo') #Legal Litres that hex and decimal legalLitresHex = "47E0" legalLitresTxt = '18,400' # file name and Legal Litres header legalHeader = ":00F0:" hexFile = "QqTrkRec.txt" # insert comment to explain change comment = "#\n# 2015 Nov 20: Legal Litres changed to 18,400\n#\n" commentFlag0 = "# SetDATA" commentFlag1 = "# SetDATA" try: for i in mdcArray.split(' '): line = "" Qqfile = glob.glob("/shares/web/vm3618/optiload/prog/MDC"+i+"/*/"+hexFile) outFile = Qqfile[0]+".new" print i 

Когда вы export переменную из оболочки, то, что вы действительно делаете, добавляет ее в массив «среда» POSIX, который наследует все дочерние процессы. Но среда POSIX представляет собой плоский массив строк name = value; он сам не может содержать массивы. Поэтому Баш даже не пытается помещать туда массивы. Это позволит вам export переменную массива, и при этом даже устанавливает флаг «exported» для этой переменной, но среда не затрагивается. Вы можете проверить этот факт, запустив env или новую копию bash и выбрав «экспортированную» переменную:

 $ export myArr=(this is an array) $ bash -c 'echo "${myArr[@]}"' $ 

(Некоторые другие массивы-оболочки, в частности ksh, фактически экспортируют переменную массива в среду, но экспортированное значение будет состоять только из первого элемента массива.)

Если вы хотите передать массив оболочек скрипту Python, лучше всего сделать это в качестве аргументов командной строки. Если вы запустите скрипт Python следующим образом:

 python code.py "${mdcNo[@]}" 

… тогда код Python может просто перебирать sys.argv , который всегда является списком. (В частности, переданный массив будет срезом sys.argv[1:] , так как sys.argv[0] всегда задается именем самого скрипта.)

Если это не вариант, вам придется установить переменную окружения в строку с некоторым разделителем между элементами и разделить ее внутри кода Python. Что-то вроде этого..

Bash:

 export mdcList='0021,0022,0036,0055,0057,0059,0061,0062,0063,0065,0066,0086,0095,0098,0106,0110,0113,0114,0115,0121,0126,0128,0135,0141,0143,0153,0155,0158' 

Или вы можете построить строку из массива:

 export mdcList=${mdcNo[0]} for i in "${mdcNo[@]:1}"; do mdcList+=,$i done 

В любом случае, скрипт Python может восстановить массив в виде списка:

 mdc_no = os.getenv('mdcList').split(',') 

Если элементы массива – это не просто числа, вы можете заменить запятую чем-то менее вероятным для отображения в элементе; традиционным выбором будет ASCII Unit Separator (U + 001F, $'\x1f' в Bash, '\x1f' в Python).

Я думаю, что Марк Рид уже дал вам очень хорошее объяснение и решение. Тем не менее, рассмотрели ли вы использование argparse python?

 #!/usr/bin/env python import argparse def main(): parser = argparse.ArgumentParser() parser.add_argument('stuff', nargs='+') args = parser.parse_args() print args.stuff if __name__ == '__main__': main() 

Использование:

 $ mdcNo=('0021' '0022' '0036' '0055' '0057' '0059' '0061' '0062' '0063' '0065' '0066' '0086' '0095' '0098' '0106' '0110' '0113' '0114' '0115' '0121' '0126' '0128' '0135' '0141' '0143' '0153' '0155' '0158') $ python argp.py "${mdcNo[@]}" ['0021', '0022', '0036', '0055', '0057', '0059', '0061', '0062', '0063', '0065', '0066', '0086', '0095', '0098', '0106', '0110', '0113', '0114', '0115', '0121', '0126', '0128', '0135', '0141', '0143', '0153', '0155', '0158']