2015-11-20 21 views
5

ancak ben bu hatayı almaya devam eski getenv yöntemini kullanarak python için bash bir dizi geçirilecek çalışıyorum:geçen bash dizisi

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

birisi açıklayabilir misiniz neden $ mdcNo değil mi' Bash'tan python'a başarılı bir şekilde geçiyor mu?

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

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

Bir değişken * ad * değil içeriğini ihracat. ihracat mdcNo 'ihracat $ mdcNo' değil. –

+0

Sorununuzun, Etan'ın geçerli yorumundan daha fazla cevabını aldığını varsayıyorum ... eğer öyleyse, sorunuzu düzenleyebilir miydiniz, bu bir yazım hatası olarak kapanmıyor mu? – Foon

cevap

9

Eğer export kabuğundan değişken, ne gerçekten POSIX'e eklemeden olduğu yapıyoruz "çevre" dizi tüm çocuk süreçleri miras alır. Ancak POSIX ortamı düz bir ad dizisi = değer dizeleridir; kendisi diziler içeremez. Bash, dizileri buraya koymaya bile çalışmıyor. export bir dizi değişkenine izin verecek ve bunu yaptığınızda, bu değişken üzerinde "dışa aktarılan" bayrağını ayarlar, ancak çevreye dokunulmaz.

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

$ 

(Diğer bazı dizi-sahip kabuklar, özellikle Ksh, aslında çevreye bir dizi değişkeni ihraç edecek: Sen env veya bash yeni bir kopyasını çalıştıran ve "ihraç" değişkeni bakarak bu gerçeği doğrulayabilirsiniz Ancak, dışa aktarılan değer dizinin yalnızca ilk öğesinden oluşur.)

Bir kabuk dizisini Python komut dosyasına iletmek isterseniz, en iyi seçim komut satırı argümanları olarak yapılır. Böyle Python komut çalıştırırsanız:

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

... sonra Python kodu olabilir hep bir listedir sys.argv üzerinde sadece döngü. ( sys.argv[0] hep betiğin kendi adına ayarlanır beri Özellikle geçirildi, dizi, dilim sys.argv[1:] olacaktır.)

bir seçenek değilse, o zaman bir çevre değişkeni ayarlamak gerekecek Öğeler arasında bir sınırlayıcı ile dize ve Python kodunun içine böl. Böyle bir şey ..

Bash: Eğer diziden kadar dize inşa edebilirsiniz

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' 

Veya:

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

Ya şekilde, Python komut gibi bir liste olarak diziyi kurtarabilirsiniz this:

Dizi öğeleriniz yalnızca sayı değilse, virgülü bir şeyle değiştirebilirsiniz. Bir öğede görünme olasılığı daha azdır; geleneksel seçim ASCII Birim Ayırıcı (B + 0,, Python'da '\x1f') olacaktır.

2

Mark Reed'in size çok iyi bir açıklama ve çözüm verdiğini düşünüyorum. Yine de, python'un argparse'u kullanmayı düşündünüz mü?

#!/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() 

Kullanım:

$ 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 Sorunuzu anladığımdan emin değilim. 'args.stuff' bir liste – lorenzog

+0

@MarkReed benim kötü - Ben kaynağında sabitlemiştim (ilk önce' action = 'append' 'kodunu kullandım ama çıktıyı düzeltmedim). Teşekkürler – lorenzog