繁体   English   中英

Python:使用xmllint时,子进程通信会无限期地等待

[英]python: subprocess communicate waits indefinitly when using xmllint

我有python 2.6,它具有toprettyxml()的旧版本,该版本未按预期方式进行xml格式化。 因此,我试图使用子进程调用xmllint。 这是我的简化代码。

      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

输出以下内容后,程序将无限期挂起。 我想它正在等待一些输入。

 -> python ~/myscripts/resources/test_xtract.py
['xmllint', '-format', '-', '<<<', '<?xml version="1.0" encoding="UTF-8"?> <insertion> <mytag>123456</mytag> <mytag2>789</mytag2> </insertion>']

我已经使用了here字符串作为xmllint的输入,那么为什么它仍在等待输入? 我正在尝试调试此问题,但是havnt找到了解决此问题的具体方法。 任何指针都会有很大帮助

这里的字符串<<<是一个shell构造。 当使用shlex() ,命令行将被拆分为多个参数,就像shell在那里一样,因此您不需要shell=True ,但是shlex不会(也不会)知道您是否要尝试解析仍然需要外壳...。这当然正是这里的问题。

如果您真的很绝望,当然可以在shell shlex用以简单地打印一个字符串(在这种情况下,取出shlex并使用shell=True传递长字符串),但是,Python也可以做到这一点。

from subprocess import run, PIPE

xml = '<?xml version="1.0" encoding="UTF-8"?> <insertion> <mytag>123456</mytag> <mytag2>789</mytag2> </insertion>'
xmllint = run(['xmllint', '-format', '-'], input=xml, stdout=PIPE, universal_newlines=True)
print(xmllint.stdout)

使用此简单的静态命令, shlex有点过头了,尽管它当然可以使您避免精确地了解shell如何解析命令行。 我只是将命令硬编码在这里。

如果您真的迷上了Python 2,请考虑切换到2.7,它的subprocess.check_output()可以完成几乎相同的操作,尽管接口有些笨拙。

如果您真的迷上了Python 2.6,那么为了直接与Popen()进行交互,该过程将非常类似于您现有的代码-您只需要更改它即可通过p = Popen(['xmllint', etc]); p.communicate('string') p = Popen(['xmllint', etc]); p.communicate('string') ,或者Popen("xmllint etc <<<'%s'" % string, shell=True)的罪恶诱惑(尽管在后一种情况下,如果没有shlex ,您将必须考虑如何对输入字符串中的任何单引号进行转义,或者忍受它们会导致语法错误的事实,因此,当第一种选择更清晰,更简单时,这里的诱惑可能不是很强烈) 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM