我得到了python2.6,它有一个旧版本的toprettyxml(),它没有按照预期进行xml格式化。因此,我尝试使用子进程调用xmlint。这是我的简化代码。在
xmlParseCmd = "xmllint -format - <<< '%s'" % '<?xml version="1.0" encoding="UTF-8"?> <insertion> <mytag>123456</mytag> <mytag2>789</mytag2> </insertion>'
print shlex.split(xmlParseCmd)
pxmlParser = subprocess.Popen(shlex.split(xmlParseCmd), stdout=subprocess.PIPE)
pretty_xml = pxmlParser.communicate()[0]
print pretty_xml
程序在以下输出后无限期挂起。我想它正在等待一些输入。在
^{2}$我使用了一个here字符串作为xmllint的输入,那么它为什么还在等待输入呢?我一直在试着调试这个,但没有找到任何具体的解决办法。任何建议都会有很大的帮助
here字符串}不需要,也不知道您试图解析的内容是否仍然需要shell。。。。这当然是问题所在。在
<<<
是一个shell构造。当使用shlex()
时,命令行将被拆分为多个参数,就像shell在那里一样,因此您不需要shell=True
,但是{如果您真的很绝望,您可以调用shell来简单地打印一个字符串(在这种情况下,去掉
shlex
并用shell=True
传递长字符串),但是,您知道,Python也可以这样做。在使用这个简单的静态命令,
shlex
有点过火了,不过它当然可以让您避免弄清楚shell将如何解析您的命令行。我只是把命令硬编码在这里。在如果您真的困在Python2上,可以考虑切换到2.7,它的
subprocess.check_output()
功能基本相同,尽管接口有些笨拙。在如果您真的被困在Python2.6上,那么为了直接与
Popen()
交互,这个过程将非常类似于您现有的代码—您只需更改它,要么使用p = Popen(['xmllint', etc]); p.communicate('string')
传递输入,要么屈服于Popen("xmllint etc <<<'%s'" % string, shell=True)
的罪恶诱惑(尽管在后一种情况下,没有shlex
,您将不得不考虑如何转义输入字符串中的任何单引号,或者接受这样一个事实,即它们会导致语法错误,因此,当第一个备选方案更加清晰和简单时,这里的诱惑可能不是很强烈)。在相关问题 更多 >
编程相关推荐