2011-09-22 213 views
-1

這裏打印列表內容的標準錯誤的語句是情景:我怎樣才能在Python

我希望能夠打印的空調風格聲明:

print >> sys.stderr, ("%s does not exist"%m_args) 

無論是裏面的功能,或在__main__

,但我得到異常:

print >> sys.stderr, ("%m_args[1] does not exist"%m_args[1]) 
IndexError: list index out of range 

代碼:


#!/usr/bin/env python 

import re, os, sys, jira, subprocess 
from optparse import OptionParser 
import warnings 
from collections import namedtuple 

global m_args 

def verify_commit_text(tags): 
    for line in tags: 
     if re.match(r'[^\NO-TIK]',line): 
      return False 
     elif re.match(r'[^\NO-REVIEW]', line): 
      return False 
     elif re.match(r'[a-zA-Z]+-\d+', line): 
      # Validate the JIRA ID 
      m = re.search("([a-zA-Z]+-\d+)",line) 
      m_args = m.group(1) 
      m_args = [m_args] 
      print 'm_args' 
      print m_args 
      print type(m_args) 
      if CheckForJiraIssueRecord(m_args): 
       return False 
      else: 
       #warnings.warn("%s does not exist"%m_args) 
       print >> sys.stderr, ("%s does not exist"%m_args) 
       return True 
     else: 
      return True 

def CheckForJiraIssueRecord(my_args): 
    # turn off stdout 
    #sys.stdout = open(os.devnull) 
    #sys.stderr = open(os.devnull) 
    com = jira.Commands() 
    logger = jira.setupLogging() 
    jira_env = {'home':os.environ['HOME']} 
    command_name = "cat" 
    server = "http://jira.server.com:8080/rpc/soap/jirasoapservice-v2?wsdl" 
    options = namedtuple('Options', 'user password')('user','password') 
    jira.soap = jira.Client(server) 
    jira.start_login(options, jira_env, command_name, com, logger) 
    issue = com.run(command_name, logger, jira_env, my_args) 
    if issue: 
     return True 

if __name__ == '__main__': 
    commit_text_verified = verify_commit_text(os.popen('hg tip --template "{desc}"')) 
    if commit_text_verified: 
     sys.exit(1) 
    else: 
     print >> sys.stderr, ('[obey the rules!]') 
     print >> sys.stderr, ("%s does not exist"%m_args[0]) 
     sys.exit(0) 
+0

很明顯,因爲'm_args [1]'不存在,試圖訪問它會引發一個'IndexError',當你試圖訪問它時,因爲它不存在!你想要打印什麼? –

+0

from 3 lines: m = re.search(「([a-zA-Z] + - \ d +)」,line) m_args = m.group(1) m_args = [m_args] 我想打印輸出「m-args」 – kamal

+0

對不起,這只是一個小實驗,用[0]代替[1],否則代碼匹配如果我使用打印>> sys.stderr,(「%s不存在」%m_args) 在__main__我得到.... []不存在 – kamal

回答

2

看這句話:

print >> sys.stderr, ("%s does not exist"%m_args) 

verify_commit_text()功能。

現在,看看行導致錯誤的__main__

print >> sys.stderr, ("%m_args[0] does not exist"%m_args[0]) 

您需要%s更換%m_args[0]裏面的字符串。

此外,您正在使用兩種不同的m_args - 您試圖從全球版本中獲得print,而您在verify_commit_text()中創建了本地版本。添加global m_argsverify_commit_text()頂部擺脫指數錯誤的(你在過去的elif正則表達式匹配的情況下,你仍然會得到它爲你打else條款的情況。)

也出現有其他問題。您在verify_commit_text()中有一個for循環,但是您只能進入第一次迭代,因爲您的所有if分支return

您還發送sys.stderros.devnull,所以即使您的print工作,你也不會看到任何東西。

此外,您的退出條件錯誤。你失敗返回True,然後使用exit(0)如果結果是True - 將其更改爲if not commit_text_verified:

一兩件事:CheckForJiraIssueRecord(m_args)沒有一個return所以它總是返回None,所以if條件是在永遠不會是True - 你總是會去else

+0

我想:

 else: print >> sys.stderr, ('[obey the rules!]') print >> sys.stderr, ("%s does not exist"%m_args[0]) #sys.stdout.writelines(m_args.pop()) sys.exit(1) 
,但我得到索引超出範圍例外的,我覺得我失去了一些東西明顯 例外: 回溯(最近通話最後一個): 文件「/home/qa/jira-test/.hg/打印>> sys.stderr,(「%s不存在」%m_args [0]) IndexError:列表索引超出範圍 – kamal

+0

@kamal請閱讀我的答案的其餘部分。您需要將'global m_args'語句添加到'verify_commit_text()'的頂部,即使如此,如果您擊中了'if'的'else'子句,則會得到'IndexError',因爲那樣'm_args'會永遠不會被設置。 – agf

+0

@kamal另外,請務必閱讀我剛添加到我帖子末尾的新行。您似乎有退出狀態倒退。只是發現了另一個錯誤,補充說。 – agf