2016-06-29 4 views
0

내가 파이썬 2.7에서 작동하도록 최적화 된 파이썬 스크립트를 실행하려고 해요 :나가서 설명하자면 NameError : 이름은 'N'파이썬 스크립트에 정의되지 않은

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

을하지만이 오류 메시지가 계속 :

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

조언을 보내 주시면 감사하겠습니다.

+0

'elif opt ('-n ') :'행에 값을'n '으로 지정하십시오. 그래서 그 라인이 평가되지 않으면,'n'은 할당되지 않습니다, 그리고 그것은 당신의 에러입니다. – Jeff

답변

1

n은 모든 코드 경로에 정의되어 있지 않습니다. 당신이 경로를 따라 경우에만 정의됩니다

elif opt in ('-n'): 

더 높은 범위에서 m 정의를 디폴트 값 (루프에 대한 즉 전에) 당신은 나중에 그것을 사용하려는 경우.

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

인수를 구문 분석하려면 argparse 패키지를 사용하는 것이 좋습니다. 약간의 학습 곡선이 있지만 필요한 사용법을 매우 견고하게 생성 할 수 있습니다.

1

루프를 입력하기 전에 n에 값을 할당해야합니다.

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

당신을 환영합니다! 이 답이 당신을 도왔다면, 당신도 그것을 받아들이므로 다른 사람들도 그 혜택을 누릴 수 있습니다! –

관련 문제