在python中,try/except如何将数据传递回调用脚本

在python中,try/except如何将数据传递回调用脚本,python,exception-handling,Python,Exception Handling,我有一个从php脚本执行的python脚本 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 emai

我有一个从php脚本执行的python脚本

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)   
这个脚本发送和发送电子邮件,比使用swiftmailer的php快几个数量级,但我有一个问题。我对python或charachter编码不太了解,有时会在python的MIMEText库中生成编码错误。我在谷歌上搜索并找到了一个解决方案,但我仍然希望在python脚本出现故障时使用php脚本作为备用

问题是,在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)
错误:root:主处理程序出现异常
回溯(最近一次呼叫最后一次):
文件“/usr/share/nginx/mandrill/mandrill.py”,第16行,在
email=MIMEText(html,'html')
文件“/usr/lib/python2.7/email/mime/text.py”,第30行,在__
self.set\u有效负载(\u文本,\u字符集)
文件“/usr/lib/python2.7/email/message.py”,第226行,在set\u有效载荷中
self.set\u字符集(字符集)
文件“/usr/lib/python2.7/email/message.py”,第262行,在set\u字符集中
self.\u payload=self.\u payload.encode(charset.output\u charset)
UnicodeEncodeError:“ascii”编解码器无法对9580位置的字符u'\u2019'进行编码:序号不在范围内(128)

您正在使用sys.exit(1)终止程序。 如果您想将数据返回到某个地方,我将与您交换sys.exit(1)行

    return json.dumps(result)

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

另外,调用
raise
会将异常传播到脚本的主要部分,从而阻止执行
返回json.dumps(result)
(应该是
打印
)。您无需再次引发异常(您的脚本仍将终止)

您可能还(或者相反)希望通过
sys.exit()
设置python脚本的返回代码,然后PHP脚本可以检查返回代码以检测错误。约定是将成功的返回码设置为0,将失败的返回码设置为其他任何值


另外,您使用的是一个bare exception子句,它将捕获所有异常—您看到的实际异常是什么?你能用完整的回溯更新你的问题吗?

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

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

回溯表明

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

事实并非如此;导致错误回溯的代码中缺少
'utf-8'
参数。

好的,如果代码块放在引发异常后的行上,它会到达吗?这在python中是如何工作的。我将修改我问题中的代码,以便您可以看到我的意思听起来您应该发布错误消息,以便我们可以告诉您如何使Python脚本不会失败。很有可能你最终发送了错误的邮件,这些邮件可能无法正确显示,或者根本无法显示。我一直无法回答这个问题。FWIW,你在这里添加的注释a几乎只有以前在这里发表过评论的人才能看到。downvoter,想发表评论吗?我不是downvoter,但我可以看到这样一个混乱的问题是如何被认为的“不太可能帮助未来的访客”。这里有太多的字里行间和一些相当尴尬的假设。(而且,选民可能永远也看不到你的问题。)请参阅更新。但我实际上只是在重复@mhawke的答案,所以也许你应该接受。这就是我想弄明白的。对于某些字符,电子邮件会失败,但对于其他字符,它会发送良好。fwiw,我直接从python文档复制了MimeText。我对你的答案投了赞成票,因为它帮助我理解了我的问题。