python:使用xmllin时,子进程通信等待不确定

2024-09-27 23:19:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到了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的输入,那么它为什么还在等待输入呢?我一直在试着调试这个,但没有找到任何具体的解决办法。任何建议都会有很大的帮助


Tags: 进程prettyxmlsplitsubprocessprintshlexinsertion
1条回答
网友
1楼 · 发布于 2024-09-27 23:19:58

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

如果您真的很绝望,您可以调用shell来简单地打印一个字符串(在这种情况下,去掉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将如何解析您的命令行。我只是把命令硬编码在这里。在

如果您真的困在Python2上,可以考虑切换到2.7,它的subprocess.check_output()功能基本相同,尽管接口有些笨拙。在

如果您真的被困在Python2.6上,那么为了直接与Popen()交互,这个过程将非常类似于您现有的代码—您只需更改它,要么使用p = Popen(['xmllint', etc]); p.communicate('string')传递输入,要么屈服于Popen("xmllint etc <<<'%s'" % string, shell=True)的罪恶诱惑(尽管在后一种情况下,没有shlex,您将不得不考虑如何转义输入字符串中的任何单引号,或者接受这样一个事实,即它们会导致语法错误,因此,当第一个备选方案更加清晰和简单时,这里的诱惑可能不是很强烈)。在

相关问题 更多 >

    热门问题