2015-11-20 12 views
5

Sto cercando di passare un array da bash a Python utilizzando il vecchio metodo getenv tuttavia continuo a ricevere questo errore:passando serie bash alla lista 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' 

Qualcuno potrebbe spiegare perché l'isn $ mdcNo' passare da bash a python con successo?

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

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

si esporta una variabile * nome * non i suoi contenuti. 'export mdcNo' not' export $ mdcNo'. –

+0

Suppongo che il tuo problema abbia più a che fare con la risposta del commento valido di Etan ... se sì, potresti modificare la tua domanda in modo che questo non venga chiuso come errore di battitura? – Foon

risposta

9

Quando si export una variabile dalla shell, ciò che si sta realmente facendo è di aggiungere l'POSIX "ambiente" di matrice che tutti i processi figli ereditano. Ma l'ambiente POSIX è una matrice piatta di stringhe name = value; non può di per sé contenere matrici. Quindi Bash non tenta nemmeno di mettere gli array lì. Ti consente di impostare export una variabile di matrice, e così facendo imposta anche il flag "esportato" su quella variabile, ma l'ambiente non viene toccato. È possibile verificare questo fatto eseguendo env o una nuova copia del bash e alla ricerca per la variabile "esportato":

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

$ 

(Alcune altre shell di array-avere, in particolare ksh, sarà effettivamente esportare una variabile array per l'ambiente , ma il valore esportato consisterà solo nel primo elemento dell'array.)

Se si desidera passare un array di shell allo script Python, si consiglia di farlo come argomenti della riga di comando. Se si esegue lo script Python come questo:

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

... poi il codice Python può solo loop su sys.argv, che è sempre una lista. (In particolare, la matrice passata sarà la fetta sys.argv[1:], poiché sys.argv[0] è sempre impostata sul nome dello script stesso.)

Se questa non è un'opzione, sarà necessario impostare la variabile di ambiente su stringa con qualche delimitatore tra gli elementi e dividerlo all'interno del codice Python. Qualcosa di simile ..

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' 

Oppure si può costruire la stringa fino dalla matrice:

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

In entrambi i casi, lo script Python può recuperare l'array come una lista come questo:

Se i vostri elementi di matrice non sono solo numeri, è possibile sostituire la virgola con somethin g meno probabilità di apparire in un elemento; la scelta tradizionale sarebbe il separatore di unità ASCII (U + 001F, $'\x1f' in Bash, '\x1f' in Python).

2

Penso che Mark Reed ti abbia già fornito un'ottima spiegazione e soluzione. Tuttavia, hai preso in considerazione l'utilizzo di 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() 

Usa:

$ 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 Non sono sicuro di aver capito la tua domanda. 'args.stuff' è una lista – lorenzog

+0

@MarkReed my bad - L'ho risolto nel sorgente (ho usato' action = 'append'' nel codice) ma non ho risolto l'output. Grazie – lorenzog