簡體   English   中英

將bash數組傳遞給python列表

[英]passing bash array to python list

我正在嘗試使用舊的getenv方法將數組從bash傳遞給python但是我一直收到此錯誤:

./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

代碼.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

從shell export變量時,您真正要做的是將其添加到所有子進程繼承的POSIX“環境”數組中。 但POSIX環境是一個名稱=值字符串的平面數組; 它本身不能包含數組。 所以Bash甚至沒有嘗試將數組放在那里。 它將允許您export數組變量,這樣做甚至可以在該變量上設置“已導出”標志,但不會觸及環境。 您可以通過運行envbash的新副本並查找“exported”變量來驗證此事實:

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

$

(其他一些具有shell的數組,特別是ksh,實際上會將數組變量導出到環境中,但導出的值只包含數組的第一個元素。)

如果要將shell數組傳遞給Python腳本,最好將其作為命令行參數。 如果你像這樣運行Python腳本:

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

...然后Python代碼可以循環遍歷sys.argv ,它始終是一個列表。 (具體來說,傳入的數組將是片sys.argv[1:] ,因為sys.argv[0]總是設置為腳本本身的名稱。)

如果這不是一個選項,那么你必須將環境變量設置為一個字符串,在元素之間有一些分隔符並將其拆分在Python代碼中。 像這樣的東西......

擊:

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單位分隔符(U + 001F,Bash中的$'\\x1f' '\\x1f' ,Python中的'\\x1f' )。

我認為Mark Reed已經給了你很好的解釋和解決方案。 不過,您是否考慮過使用python的argparse

#!/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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM