<p>在WeasyPrint的公共API中,我接受HTML输入的文件名(以及其他类型)。任何与内置<code>open()</code>一起工作的文件名都应该可以工作,但我需要将其转换为<code>file://</code>方案中的URL,该方案稍后将传递给<code>urllib.urlopen()</code>。</p>
<p>(所有内容在内部都是URL格式的。为了用<code>urlparse.urljoin()</code>解析相对URL引用,我需要一个文档的“基本URL”。)</p>
<p><a href="http://docs.python.org/library/urllib.html#urllib.pathname2url">urllib.pathname2url</a>是一个开始:</p>
<blockquote>
<p>Convert the pathname path from the local syntax for a path to the form used in the path component of a URL. <strong>This does not produce a complete URL.</strong> The return value will already be quoted using the quote() function.</p>
</blockquote>
<p>重点是我的,但我需要一个完整的网址。到目前为止,这似乎是可行的:</p>
<pre class="lang-py prettyprint-override"><code>def path2url(path):
"""Return file:// URL from a filename."""
path = os.path.abspath(path)
if isinstance(path, unicode):
path = path.encode('utf8')
return 'file:' + urlparse.pathname2url(path)
</code></pre>
<p>UTF-8似乎是由<a href="http://tools.ietf.org/html/rfc3987">RFC 3987 (IRI)</a>推荐的。但在这种情况下(URL最终是指urllib)也许我应该使用<a href="http://docs.python.org/library/sys.html#sys.getfilesystemencoding">sys.getfilesystemencoding()</a>?</p>
<p>然而,基于<a href="https://en.wikipedia.org/wiki/File_URI_scheme">the literature</a>,我不应该只准备<code>file:</code>,而应该准备<code>file://</code>。。。除非我不应该这样做:在Windows上,<code>nturl2path.pathname2url()</code>的结果已经以三个斜杠开头。</p>
<p>所以问题是:有没有更好的方法来做到这一点并使之跨平台?</p>