2
4

2 回答 2

3

你想避免echo在这种情况下使用;而是将您的输入直接写入对象的stdin管道。Popen()

请确保您的环境设置为正确的语言环境,以便grep知道将输入解析为 UTF-8:

env = dict(os.environ)
env['LC_ALL'] = 'en_US.UTF-8'
p = subprocess.Popen(['grep', '-E', mainconf["MSG_FORMAT"][msgtype,fieldname]], stdin=subprocess.PIPE, env=env)
p.communicate(datarecord[fieldname])
if p.returncode:
     return fieldname
于 2013-03-24T15:13:52.507 回答
0

只是为了补充 Martijn Pieters 的答案,他建议的解决方案在输入字符串为空的情况下将失败(与原始函数不同,即使正则表达式允许,grep 也将无法匹配空字符串)。因此,原始功能的完整实现将是:

if (msgtype,fieldname) in mainconf["MSG_FORMAT"]:
        if not datarecord[fieldname]:
            if not regex.search(mainconf["MSG_FORMAT"][msgtype,fieldname],datarecord[fieldname],regex.UNICODE):
                return fieldname
        else:               
            curenv = os.environ
            curenv['LC_ALL']="en_US.UTF-8"
            check = subprocess.Popen(['grep','-E', mainconf["MSG_FORMAT"][msgtype,fieldname]], stdin=subprocess.PIPE, env=curenv, stderr=subprocess.STDOUT,stdout=subprocess.PIPE)
            check.communicate (datarecord[fieldname]) 
            if check.returncode:
                return fieldname
return None

这可以作为regex匹配在空字符串上正常工作。

于 2013-03-26T05:09:09.217 回答