<p>首先,<code>subprocess.Popen</code>的第一个参数通常应该是一个列表(除非您还传递了<code>shell=True</code>)。<code>No such file or directory</code>几乎可以肯定是由于系统中缺少名为<code>"htmldoc -t pdf quiet '...</code>的文件(它试图查找并运行为整个字符串值命名的程序)。在</p>
<p>其次,如果你在htmldoc的stdin上给htmldoc一些html,它就会在stdout上输出一个pdf文件,从而避免了对临时文件的需要。在</p>
<p>尝试一下(未经测试):</p>
<pre><code>htmldoc = subprocess.Popen(
['/usr/bin/htmldoc', '-t', 'pdf', ' webpage', '-'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
stdout, stderr = htmldoc.communicate(html)
</code></pre>
<p>注意:用<code>/usr/bin/htmldoc</code>代替系统上htmldoc的真正路径。在</p>
<p>htmldoc程序的<code>-</code>参数告诉它从stdin读取。您将把html字符串值(<code>html</code>)作为<code>htmldoc.communicate</code>调用的参数传递给htmldoc的<code>stdin</code>。生成的pdf输出应该在<code>stdout</code>中可用,任何其他消息或统计信息都应该在<code>stderr</code>中可用。在</p>
<p><strong>编辑</strong>:文档看起来确实有点不可靠,但确实有很多。对于<a href="https://www.msweet.org/documentation/project1/HTMLDOC.html" rel="nofollow">html in one page</a>或{a2}版本,或者<a href="http://manpages.ubuntu.com/manpages/oneiric/en/man1/htmldoc.1.html" rel="nofollow">man page</a>,您可能会有更好的运气。在</p>
<p>另外,一定要向htmldoc进程的stdin传递一个字符串或类似的字符串。直接传递StringIO对象,正如我前面的代码片段所暗示的那样,将不起作用。在</p>