передача массива 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 

2 Solutions collect form web for “передача массива bash в список python”

Когда вы 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'] 
  • Установить tkinter для Python
  • Скомпилированные двоичные отчеты Python неправильной версии
  • сценарий в полноэкранном режиме, curses-style, обновление табличного вывода (a la top) на unixen
  • Почему Python «упреждающе» висит, пытаясь вычислить очень большое число?
  • Запуск mnist_softmax.py в Tensorflow, установленном с помощью Docker
  • В чем преимущество очередей по трубам при общении между процессами?
  • Виртуальные скобки в Python
  • Как добавить расширения файлов на основе типа файла в Linux / Unix?
  •  
    Interesting Posts for Van-Lav

    Ошибка сохранения admin в Django: get_db_prep_value () получил неожиданный аргумент ключевого слова 'connection'

    Идея синтаксической диаграммы синтаксического анализа

    Как найти количество байтов, полученных переменной python

    Измерение увеличения размера кучи после загрузки большого объекта

    Используя scikit-learn, как узнать SVM над небольшим набором данных?

    Где параметр по умолчанию в функции Python

    Почему scipy.optimize.minimize (default) сообщает об успехе, не двигаясь с Skyfield?

    Как выбрать элементы по строке из массива NumPy?

    Профилирование Python. Каковы столбцы в выводе runnakerun?

    Не удается установить Pillow для Python 3.x в Windows – требуется Zlib

    Как использовать Content-Encoding: gzip с Python SimpleHTTPServer

    Найдите конец месяца Серия Pandas DataFrame

    Рендеринг объектов JSON с использованием шаблона Django после вызова Ajax

    Как вы тестируете задачу Сельдерея?

    Изменение кодировки по умолчанию для Python?

    Python - лучший язык программирования в мире.