子流程.Popen(..).communication(..)与graphviz一起使用时随机丢弃数据!

2024-10-01 17:31:49 发布

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

我使用graphviz的dot为web应用程序生成一些svg图形。我用Popen给dot打电话:

    p = subprocess.Popen(u'/usr/bin/dot -Kfdp -Tsvg', shell=True,\
    stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    str = u'long-unicode-string-i-want-to-convert'
    (stdout,stderr) = p.communicate(str)

结果是dot程序抛出的错误如下:

^{pr2}$

这个明显的错误肯定不在输入字符串中。尤其是,如果我把它保存到字符串.txt使用utf-8编码和do

/usr/bin/dot -Kfdp -Tsvg < str.txt > myimg.svg

我得到了期望的输出。str唯一“特别”的地方是它包含了像丹麦语åå这样的字符。在

现在我不知道该怎么办。这个问题很可能是由dot引起的,但它显然是由Popen与使用shell不同引起的,我不知道从哪里开始。有什么帮助或想法,或者调用dot(除了将所有数据写入文件并调用它!)非常感谢!在


Tags: 字符串svgtxtbinusr错误stdoutshell
1条回答
网友
1楼 · 发布于 2024-10-01 17:31:49

听起来你应该这样做:

stdout, stderr = p.communicate(str.encode('utf-8'))

(当然,除了不应该隐藏内置的str)Python中的unicode类型保存unicode数据,而不是UTF-8。如果你想要UTF-8,你需要显式地编码它。在

除此之外,没有理由在该片段中使用shell=True,也没有将unicode文本传递给子流程.Popen一个特别好的主意(不管怎样,它只是被编码成ASCII代码)而且末尾的反斜杠是不必要的,Python知道这行是继续的,因为有一个左括号还没有结束。所以,使用:

^{pr2}$

相关问题 更多 >

    热门问题