如何从python中的另一个函数中调用一个函数

时间:2011-09-21 18:31:32

标签: python

这似乎是一个非常基本的问题,但我很难理解它,并会感激任何帮助。

我希望能够致电CheckForJiraIssueRecord verify_commit_text

这是代码:当我运行它时,我得到错误:

jira ticket regex matched!
printing m.group(1)
QA-65
my_args ...
QA-65
transaction abort!
rollback completed
abort: pretxncommit.jira hook exited with status 1

意思是,CheckForJiraIssueRecord(my_args)没有被调用

#!/usr/bin/env python
import re, os, sys, jira, subprocess 
def verify_commit_text(tags):
     for line in tags:
         if re.match('^NO-TIK',line):
             return True
         elif re.match('^NO-REVIEW', line):
             return True
         elif re.match(r'[a-zA-Z]+-\d+', line):
             # Validate the JIRA ID
             print 'jira ticket regex matched!'
             m = re.search("([a-zA-Z]+-\d+)",line)
             print 'printing m.group(1)'
             print m.group(1)
             my_args = m.group(1)
             print 'my_args ...'
             print my_args
             result = CheckForJiraIssueRecord(my_args)
             print 'printing result....'
             print result
             if result == False:
                 #util.warn("%s does not exist"%my_args)
                 print 'result = False.......'
             else:
                 print 'if result == False return True'
                 return True
             return True
         else:
             return False
 def CheckForJiraIssueRecord(object):
     sys.stdout = os.devnull
     sys.stderr = os.devnull

     try:
         com = jira.Commands()
         logger = jira.setupLogging()
         jira_env = {'home':os.environ['HOME']}
         command_cat= "cat"
         command_logout= "logout"
         #my_args = ["QA-656"]
         server = "http://jira.myserver.com:8080/rpc/soap/jirasoapservice-v2?wsdl"
     except Exception, e:
         sys.exit('config error')

 if __name__ == '__main__':
     commit_text_verified = verify_commit_text(os.popen('hg tip --template "{desc}"'))
     #commit_text_verified = verify_commit_text(os.popen('hg log -r $1  --template "{desc}"'))
     if (commit_text_verified):
         sys.exit(0)
     else:
         print >> sys.stderr, ('[obey the rules!]')
         sys.exit(1);

 class Options:
     pass
 options = Options()

 options.user = 'username'
 options.password = 'password'

 try:

     jira.soap = jira.Client(server)
     jira.start_login(options, jira_env, command_cat, com, logger)
     issue = com.run(command_cat, logger, jira_env, my_args)
 except Exception, e:
     print sys.exit('data error')

2 个答案:

答案 0 :(得分:1)

正在调用该函数,但由于以下行而引发异常:

32     sys.stdout = os.devnull
33     sys.stderr = os.devnull

您正在为应该是文件句柄的字符串分配一个字符串(os.devnull),因此当任何人写入stdout或stder时,由于类型错误,它将引发异常。你应该试试:

32     sys.stdout = open(os.devnull)
33     sys.stderr = open(os.devnull)

看看它对你有什么用。

答案 1 :(得分:1)

违规行:

sys.stdout = os.devnull
sys.stderr = os.devnull

您必须将sys.stdout分配给变量,并在函数完成其应该执行的操作后,将其更改回来。即

out = sys.stdout
err = sys.stderr
.... Your code
#Just befor function exits
sys.stdout = out
sys.stderr = err