在python中尝试/除了如何将数据传递回调用脚本

时间:2014-09-11 02:24:59

标签: python exception-handling

我有一个从PHP脚本执行的python脚本。

这个脚本发送和发送电子邮件,它比swiftmailer快几个数量级,但我有一个问题。我对python或charachter编码并不是很了解,有时会从python的MIMEText库中生成有关编码的错误。我用Google搜索并找到了解决方案,但我仍然希望将php脚本作为pyback脚本失败时的后备。

问题是,在except循环中,似乎我无法在脚本终止之前将数据传递回php?关于我在这里做错什么的任何想法?你可以在except块中看到我说result = {type:' failed'}然后尝试对它进行json编码,但数据没有回到php脚本。

import sys, json, os, smtplib, socket, logging
LOG_FILE='/tmp/mandrill.out'
logging.basicConfig(filename=LOG_FILE,level=logging.DEBUG)
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr

try:
    data = json.loads(sys.argv[1])
    msg = MIMEMultipart('alternative')
    msg['Subject'] = data['subject']
    msg['From']    = formataddr((str(Header(u'Business Name', 'utf-8')), data['from']))
    msg['To']      = data['to']
    html = data['body']
    email = MIMEText(html, 'html','utf-8')
    username = 'username'
    password = 'password'
    msg.attach(email)
    s = smtplib.SMTP('smtp.example.com', 587, socket.getfqdn(), 3)
    s.login(username, password)
    s.sendmail(msg['From'], msg['To'], msg.as_string())
    s.quit()
    result = {'type': 'success'}
    print json.dumps(result)
except:
    result = {'type': 'error'}
    logging.exception('Got exception on main handler')
    raise
    return json.dumps(result)   

编辑包含跟踪

ERROR:root:Got exception on main handler
Traceback (most recent call last):
  File "/usr/share/nginx/mandrill/mandrill.py", line 16, in <module>
    email = MIMEText(html, 'html')
  File "/usr/lib/python2.7/email/mime/text.py", line 30, in __init__
    self.set_payload(_text, _charset)
  File "/usr/lib/python2.7/email/message.py", line 226, in set_payload
    self.set_charset(charset)
  File "/usr/lib/python2.7/email/message.py", line 262, in set_charset
    self._payload = self._payload.encode(charset.output_charset)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 9580: ordinal not in range(128)

3 个答案:

答案 0 :(得分:3)

您不能使用return将数据返回到PHP调用脚本,您需要print,就像您在成功案例中所做的那样。

此外,调用raise会将异常传播到脚本的主要部分,从而阻止执行return json.dumps(result)(应该是print)。您不需要再次引发异常(您的脚本无论如何都会终止)。

您也可能(或者说)想要通过sys.exit()从python脚本设置返回代码,然后您的PHP脚本可以检查返回代码以检测错误。惯例是为成功设置返回代码0,为失败设置其他任何东西。

此外,您正在使用一个bare except子句来捕获所有异常 - 您看到的实际异常是什么?你能用完整的追溯来更新你的问题吗?

答案 1 :(得分:1)

raise导致Python脚本终止,因此它永远不会到达return

下一个问题是return只能在Python中使用,才能将值返回给调用函数。您可能希望打印JSON字符串(但这在某种程度上取决于您如何从PHP调用Python,这里没有记录)。

追溯表明

email = MIMEText(html, 'html','utf-8')

实际上并不属实;您在代码中缺少导致错误回溯的'utf-8'参数。

答案 2 :(得分:0)

您正在使用sys.exit(1)终止该程序。 如果你想将数据返回到某个东西,我会用

交换sys.exit(1)行
    return json.dumps(result)