以下是该方案:
我希望能够打印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)
答案 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}}。