1

我正在尝试使用 python 和 pandoc 将几段 html 转换为乳胶,但我遇到了几个问题。

为了将我的 python 脚本与我使用的 pandoc 通信subprocess.Popen,重定向stdout到我保存的文件,以便将其包含在乳胶模板中。

如果我使用经典的实现方式Popen

from subprocess import Popen, PIPE, STDOUT

filedesc = open('myfile.tex','w')
args = ['pandoc', '-f', 'html', '-t', 'latex']
p = Popen(args, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
outp, err = p.communicate(input=html)
filedesc.write(outp)

我得到了一个额外的新行,其中不应该有:

> \textbf{M. John Harrison}(橄榄球,沃克威克郡,1945 年)是当代的

>

> 英文作家。

这(神秘?)很容易通过更改stdout=PIPE文件描述符来解决:

from subprocess import Popen, PIPE, STDOUT

filedesc = open('myfile.tex','w')
args = ['pandoc', '-f', 'html', '-t', 'latex']
p = Popen(args, stdout=filedesc, stdin=PIPE, stderr=STDOUT)
outp, err = p.communicate(input=html)
# not needed
# filedesc.write(outp)

但是如果我想使用字符串缓冲区,就会出现同样的问题,因为我不能将它用作 stdout 参数。

关于如何阻止 Popen/pandoc 这样做的任何想法?

谢谢!

4

1 回答 1

1

好吧,这似乎是python PIPE(???)中的一种“错误”。

我正在 Windows 系统中执行此代码。这意味着当输入一个新行时,它们是 CR+LF (\r\n) 样式,而不是 (cleaner) LF (\n) unix 样式的新行。

当时我介绍了一个大的html文本要通过pandoc进行转换,输出通过管道返回到命令行。因此,每次达到标准列宽时,都会引入一个丑陋的“换行”字符。就我而言,是 CR+LF。这让我的输出看起来很奇怪。

我实施的肮脏解决方案是replace('\r\n','\n')在编写输出之前添加一个,但我不确定它是否是最优雅的。

from subprocess import Popen, PIPE, STDOUT

html = '<p><b>Some random html code</b> longer than 80 columns ... </p>'
filedesc = open('myfile.tex','w')
args = ['pandoc', '-f', 'html', '-t', 'latex']
p = Popen(args, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
outp, err = p.communicate(input=html)
filedesc.write(outp.replace('\r\n','\n'))**strong text**
于 2013-04-17T21:58:37.537 回答