[英]How to get exit code when using Python subprocess communicate method?
[英]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.