无法在网络浏览器中打开来自 python 的 html 文件 - 而是打开记事本

Cannot open an html file from python in a web browser - notepad opens instead

在 python 中,我正在尝试使用 pygal

绘制图表
import pygal  # First import pygal
bar_chart = pygal.Bar()
bar_chart.add('Fibonacci', [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55])
bar_chart.add('Padovan', [1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12])
bar_chart.render_in_browser()

不幸的是,它总是打开 HTML 文件,而不是浏览器 window 中的 HTML 页面。我看了很多帖子,我看到人们过去也遇到过类似的问题。我没有找到有效的解决方案。我还尝试通过 webbrowser 模块打开它,但这也会在记事本中打开 HTML 文件。

url='file://C:/Users/User1/AppData/Local/Temp/tmpsblpwtpr.html'
webbrowser.open(url)

大家有什么想法吗?

尽管标有 html 扩展名,但事实并非如此。

它是 SVG XML。

这是文件中的 header: <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" id="chart-c252fdc0-451c-4482-b9ae-09f5b513a2fc" class="pygal-chart" viewBox="0 0 800 600"><!--Generated with pygal 2.3.1 (lxml) Ā©Kozea 2012-2016 on 2017-06-09--><!--http://pygal.org--><!--http://github.com/Kozea/pygal-->

您的 xml 或 svg 设置是为记事本配置的。

请参阅网络浏览器模块文档中的以下内容:

Note that on some platforms, trying to open a filename using this function, may work and start the operating system’s associated program.

您系统上 .html 文件的关联程序很可能是记事本,而不是您的浏览器。

Python documentation for webbrowser.open 中所述,此函数不是在浏览器中打开本地文件的可靠方法:

Note that on some platforms, trying to open a filename using this function, may work and start the operating system’s associated program. However, this is neither supported nor portable.

这里的问题是webbrowser.open(Python 2.7 源代码)如何决定使用哪个程序打开url/file。当导入webbrowser时,它存储了一个对应浏览器的字符串列表(_tryorder)。此列表中的第一项(也是使用的第一个浏览器)是特定于操作系统的默认浏览器,然后是该模块检测到的其他浏览器。

默认浏览器尝试使用通用命令调用用户的默认 Internet 浏览器。根据您的操作系统(可能还有您的默认浏览器),这可能会或可能不会打开文件。比如我在MacOs上用Chrome作为默认浏览器测试时,出现了一个(n already opened) Chrome window,但是文件没有打开(也没有新的tab) ).但是,在默认为 Firefox 的 Ubuntu 中,文件是在浏览器中打开的。

在Windows中,"default browser"使用os.startfile()打开文件,Python documentation says "acts like double-clicking the file in Windows Explorer". As 提到的,很可能是.[=38=的关联程序] 计算机上的文件是记事本。如果是这种情况,将打开 .html 文件的默认程序更改为网络浏览器应该可以解决此问题。

但是,无需更改任何设置即可在 Web 浏览器中打开文件。您可以尝试通过为 webbrowser._tryorder 列出的其他浏览器之一打开它(尽管应该注意源代码(在 2.7 和 3.6 中)似乎不支持 Chrome on [=42] =]).它应该看起来像这样(尽管使用不同的浏览器名称):

>>> webbrowser._tryorder
['MacOSX', 'chrome', 'firefox', 'safari']

获得此列表后,您可以选择要使用的浏览器(在本例中为 Firefox),然后使用以下代码(根据需要替换 _tryorder 中的索引):

browser = webbrowser.get(webbrowser._tryorder[2])
browser.open(url)

当我使用 MacOs(Firefox 和 Chrome)和 Ubuntu(仅 Firefox)对其进行测试时,上面的代码成功地在 Web 浏览器中打开本地 .html 文件。我不能保证它会在 Windows 或不同的浏览器上工作,但它似乎很可能会(所有非默认 Windows 浏览器似乎都是通过 subprocess.Popen 调用的,所以只要可以从 Windows 命令行在浏览器中打开文件,它们就应该工作。