gpt4 book ai didi

python - subprocess.Popen(..).communicate(..) 与 graphviz 一起使用时会随机丢弃数据!

转载 作者:太空宇宙 更新时间:2023-11-03 11:11:21 24 4
gpt4 key购买 nike

我正在使用 graphviz 的点为 Web 应用程序生成一些 svg 图形。我使用 Popen 调用点:

    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 程序抛出如下错误:

    Error: not well-formed (invalid token) in line 1 
... <tr><td cellpadding="4bgcolor="#EEE8AA"> ...
in label of node n260

这个明显的错误肯定不在输入字符串中。特别是,如果我使用 utf-8 编码将它保存到 str.txt 并执行

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

我得到了想要的输出。 str 唯一的“特别”之处在于它包含丹麦语 øæå 等字符。

现在我不知道我应该做什么。问题很可能出在点上;但它肯定似乎是由 Popen 触发的,它与在 shell 中使用 < 不同,我不知道从哪里开始。对于替代调用 dot 的任何帮助或想法(除了将所有数据写入文件并调用它!),我们将不胜感激!

最佳答案

听起来你应该这样做:

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

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

最重要的是,没有理由在该代码段中使用 shell=True,传递给 subprocess.Popen 的 unicode 文字也不是一个特别好的主意(无论如何它只是被编码为 ASCII。 ) 最后的反斜杠是不必要的——Python 知道该行是续行的,因为您有一个尚未关闭的左括号。所以,使用:

p = subprocess.Popen(['/usr/bin/dot', '-Kfdp', '-Tsvg'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE)

关于python - subprocess.Popen(..).communicate(..) 与 graphviz 一起使用时会随机丢弃数据!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com