如何在python中的stderr语句中打印列表内容

时间:2011-09-22 15:54:26

标签: python

以下是该方案:

我希望能够打印C Style语句:

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)

1 个答案:

答案 0 :(得分: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])

您需要使用%m_args[0]替换字符串中的%s

此外,您正在使用两个不同的m_args - 您正在尝试print来自全球的verify_commit_text(),而您在global m_args中创建了本地版本。将verify_commit_text()添加到elif的顶部以消除索引错误(对于您的上一个else正则表达式匹配的情况,您仍然可以获得它for条款。)

您似乎还有其他问题。您在verify_commit_text()中有一个if循环,但您只是进入第一次迭代,因为您的所有return分支sys.stderr

您还将os.devnull发送给print,因此即使True工作,您也不会看到任何内容。

另外,你的退出条件错了。您在失败时返回exit(0),如果结果为True,则使用if not commit_text_verified: - 将其更改为CheckForJiraIssueRecord(m_args)

还有一件事:return没有None因此它始终返回if,因此它所在的True条件永远不会是else - 你总是会去{{1}}。