2011-09-22 194 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