2016-06-29 5 views
0

Ich versuche, ein Python-Skript ausführen, die mit Python arbeiten 2.7 optimiert ist:Nameerror: name ‚n‘ ist nicht in Python-Skript definiert

#!/usr/bin/env python 

import sys,getopt,os 

SplitInput_string = """#!/bin/bash 
#BSUB -J SplitInput[1-%numSamples%] 
#BSUB -o Logs/SplitInput-Out-%I.out 
#BSUB -e Logs/SplitInput-Err-%I.err 
#BSUB -q week 
#BSUB -W 23:58 
echo Date: `date` 
t1=`date +%s` 
sleep ${LSB_JOBINDEX} 
python LSFScripts/array_merge.py -r ${LSB_JOBINDEX} -i %input% -o original_reads/ 
[ $? -eq 0 ] || echo 'JOB FAILURE: $?' 
echo Date: `date` 
t2=`date +%s` 
tdiff=`echo 'scale=3;('$t2'-'$t1')/3600' | bc` 
echo 'Total time: '$tdiff' hours' 
""" 

help_message = "usage example: python setupDirs.py -i /path/to/reads/ -n numberOfSamples" 
if __name__ == "__main__": 
    try: 
     opts, args = getopt.getopt(sys.argv[1:], 'hi:n:', ["inputdir="]) 
    except: 
     print help_message 
     sys.exit(2) 
    for opt, arg in opts: 
     if opt in ('-h', '--help'): 
      print help_message 
      sys.exit() 
     elif opt in ('-i', '--inputdir'): 
      inputdir = arg 
      if inputdir[-1] != '/': 
       inputdir += '/' 
     elif opt in ('-n'): 
      n = arg 
    for dir in ['Logs', 'original_reads', 'hashed_reads', 'cluster_vectors', 'read_partitions']: 
     os.system('mkdir %s' % (dir)) 
    f = open('LSFScripts/SplitInput_ArrayJob.q', 'w') 
    f.write(SplitInput_string.replace('%numSamples%', n).replace('%input%', inputdir)) 
    f.close() 

Aber ich erhalte immer diese Fehlermeldung:

line 42, in <module> 
f.write(SplitInput_string.replace('%numSamples%', n).replace('%input%', inputdir)) 
NameError: name 'n' is not defined 

Jeder Rat würde geschätzt werden!

+0

In der Zeile 'elif opt in (' -n '): 'geben Sie nur' n' einen Wert an. Wenn diese Zeile also nicht ausgewertet wird, ist "n" nicht zugewiesen, und das ist dein Fehler. – Jeff

Antwort

1

n ist nicht in allen Codepfaden definiert. Es ist nur definiert, wenn Sie den Pfad folgen:

elif opt in ('-n'): 

definieren m auf einem höheren Umfang (das heißt vor der for-Schleife) mit einem Standardwert, wenn Sie es später verwenden.

n = #default value 
for opt, arg in opts: 
    # ... 

Wenn Sie Argumente analysieren wollen, empfehle ich das argparse Paket. Es gibt ein bisschen eine Lernkurve, aber Sie können sehr robust die notwendige Nutzung generieren.

1

Sie müssen n einen Wert zuweisen, bevor Sie die Schleife aufrufen.

if __name__ == "__main__": 
    try: 
     opts, args = getopt.getopt(sys.argv[1:],'hi:n:',["inputdir="]) 
    except: 
     print help_message 
     sys.exit(2) 

    n = "" 

    for opt, arg in opts: 

    etc... 
+0

Gern geschehen !! Wenn diese Antwort Ihnen geholfen hat, können Sie es akzeptieren, damit auch andere davon profitieren können! –

Verwandte Themen