2015-11-20 7 views
5

に、bashの配列を渡すしかし、私はこのエラーを取得しておく:$ mdcNoはにISNなぜは私が古いのgetenvメソッドを使用してのpythonには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' 

誰かが」説明してください可能性があり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 
+4

あなたは、変数*名前*ないその内容をエクスポートします。 'export mdcNo'ではなく' export $ mdcNo'です。 –

+0

私はあなたの問題がエタンの有効なコメントよりも答えに関係があると仮定しています...もしそうなら、あなたはあなたの質問を編集して、これが誤字として閉じないようにすることができますか? – Foon

答えて

9

あなたexportシェルからの変数は、何が本当にPOSIXに追加されてやっている "環境" 配列すべての子プロセスが継承します。しかし、POSIX環境は、name = value文字列のフラットな配列です。それ自身が配列を含むことはできません。だからBashは配列をそこに置くことさえしない。 exportを配列変数にして、その変数に "exported"フラグを設定することもできますが、環境には触れません。 (特にkshのいくつかの他のアレイ-たシェルは、実際の環境に配列変数をエクスポートします

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

$ 

:あなたはenvまたはbashの新しいコピーを実行し、「エクスポート」変数を探して、この事実を確認することができますエクスポートされた値は配列の最初の要素のみで構成されます)。

シェル配列をPythonスクリプトに渡す場合は、コマンドライン引数として使用することをお勧めします。あなたはこのようにPythonスクリプトを実行する場合:

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

...その後Pythonコードは常にリストであるsys.argv、オーバーだけループすることができます。具体的には、sys.argv[0]は常にスクリプト自体の名前に設定されているため、渡された配列はスライスsys.argv[1:]になります。

これはオプションではない場合は、環境変数をa文字列に要素間の区切り文字を入れて、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スクリプトは次のようにリストとして配列を回復することができますこれは:

あなたの配列要素が単なる数字ではない場合は、カンマをsomethin g要素に現れにくい。伝統的な選択肢は、ASCIIユニットセパレータ(U + 001F、Bashの$'\x1f'、Pythonの'\x1f')です。

2

私はマーク・リードはすでにあなたに非常に良い説明と解決策を与えたと思います。 しかし、あなたは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'] 
+0

@ MarkReed私はあなたの質問を理解しているか分からない。 'args.stuff'はリストです – lorenzog

+0

@MarkReed my bad - 私はソースで修正しました(私は最初に' action = 'append''をコードに使用しましたが)出力を修正しませんでした。ありがとう – lorenzog

関連する問題

 関連する問題