每 x 秒执行一次 Python 而无需重新打开选项卡

Posted

技术标签:

【中文标题】每 x 秒执行一次 Python 而无需重新打开选项卡【英文标题】:Execute Python every x seconds without reopening tabs 【发布时间】:2015-10-15 16:16:31 【问题描述】:

我正在尝试让我的 python 代码自动更新。问题是代码每次运行时都会拉出四个 html 文件,因此浏览器中有四个新选项卡。

我尝试使用类似问题的答案自动更新:What is the best way to repeatedly execute a function every x seconds in Python?

import time

starttime = time.time()

while True:
  # My code here
  output_file("first.html", title="First HTML Page")
  # More code
  output_file("second.html", title="Second HTML Page")
  # Even more code
  time.sleep(60.0 - ((time.time() - starttime) % 60.0))

这种方法的问题是每分钟它会拉出四个标签——这意味着四分钟后我已经有 16 个标签了!

有人知道如何使用相同的标签自动更新吗?我什至会删除原始标签并替换它们,即使我认为这不太优雅。

编辑:我正在运行 Windows,目前使用 IE,但我也愿意迁移到 Firefox 或 Chrome。

【问题讨论】:

什么样的标签?网络浏览器标签?我们需要看到output_file函数 @cdonts IE 中的 Web 浏览器选项卡。我不确定你所说的 output_file 函数是什么意思,为什么这很重要? IE有python插件吗? @jenryb 重要的是,看看你的代码是如何工作的。 @Mark 我不知道是不是这样。该代码也适用于 Firefox。基本上它选择默认浏览器并使用来自 Bokeh 的 output_file 命令打开四个选项卡。 【参考方案1】:

我想你最好的办法是关闭整个程序并重新启动它。如果您使用的是 Windows 计算机,请添加

from subprocess import call

开头,放

call("start chrome.exe") #For Google Chrome

最后,

call("taskkill /f /im chrome.exe")

这实际上会关闭整个浏览器并重新启动它:P

只是告诉你,如果你正在使用 Internet Explorer,请不要停止“explorer.exe”。这基本上停止了......一切。

我建议使用一些调度软件来运行您的程序,这样您就不必总是使用 RAM。很多人已经说过了

【讨论】:

感谢您的提醒,因为我使用的是 Internet Explorer。我选择使用 Firefox 打开和重新打开窗口,因此它是一个独立的浏览器,而不是我可能正在处理的其他事情。该解决方案适用于以后访问该问题的任何人,使用 firefox 的第一个调用必须是 call('firefox -savepng google.com', shell=True) 我很高兴它成功了,如果它们对你有用,请接受答案(强调请:P)。但是,还要了解这不是“技术上”理想的方法,因为选项卡的目的是通过仅处理您需要的那些来不使用尽可能多的 RAM。您可以通过命令行进行此操作(可能使用外部软件)。 它可能会解决您必须使用两个浏览器的问题【参考方案2】:

正如@padraicCunningham 在 cmets 中所说,无法通过散景在浏览器中重新加载特定选项卡。因此,您必须通过更直接地控制您的浏览器来处理这个问题。有多种选择,从在重新加载之前杀死您的浏览器(如 cmets 中建议的那样),通过 shell 接口编写浏览器脚本到在浏览器内部处理它。

我个人偏向于最后一个,这会涉及到一点 javascript。最简单的解决方案可能只是让一个页面在选项卡中打开其他 4 个页面,然后在计时器上重新加载它们。您可以在此处找到有关如何填写该表格的帮助:

How can I refresh a tab from another using Javascript How to reload page every 5 second?

这将要求您的 Python 应用程序在开始时打开一次控制页面,您可以使用 webbrowser 包来做到这一点。

【讨论】:

【参考方案3】:

另一种方法(W3C 不鼓励动态更新页面,因为它可能会干扰后退按钮)是在 HTML 的 head 部分添加一个刷新标签:

<meta http-equiv="refresh" content="5">

内容是刷新前的睡眠时间(以秒为单位)

【讨论】:

【参考方案4】:

对不起,我想对此发表评论,但我缺乏这样做的声誉。

所以这是我的建议: 在循环之前关闭文件。 我不是很喜欢 python,所以我不能给出代码示例,但也许这也可能有所帮助。

destroyWindow #or something like this. But I think that is Tkinter

close() #http://www.tutorialspoint.com/python/file_close.htm

【讨论】:

【参考方案5】:

如果你想通过下载文件来自动更新,你可以直接执行get请求,而不是通过浏览器打开它。您也可以创建一个套接字连接并执行更新。这些似乎是更可靠和优雅的方法。

浏览器方法容易出现人为干预造成的问题。 但是,如果您想通过自己的方式进行操作,则可以首次打开 4 个选项卡。并使用浏览器 dom ,只需刷新页面。 所以它会是这样的:

For every x secs:
    if first time:
        open the relevant tabs
    else:
        refresh the tabs
    check if update available and do the needfull

【讨论】:

【参考方案6】:
import keyboard

keyboard.press_and_release('F5')

【讨论】:

【参考方案7】:

在 Python 中每 x 秒重复执行一个函数的最佳方法是什么?

我不是很好,但我建议以某种方式使用for loop 来做到这一点。

def function(n):
    for x in n:
    ~~~~~~~~~~~  # Blah, Blah, Blah. Some other code that you want

【讨论】:

其实有软件可以调度运行命令行操作 @ytpillai 但是安装一个软件,就为了这个,还是挺麻烦的 其实有时候你甚至不需要安装。大多数操作系统都有一个调度程序,可以通过管理员权限访问防病毒和其他自动化软件。由于Python程序只需要使用'python'命令运行,添加它应该很容易

以上是关于每 x 秒执行一次 Python 而无需重新打开选项卡的主要内容,如果未能解决你的问题,请参考以下文章

python定时器每隔几秒执行一次

如何切换输入单选按钮每 3 秒检查一次?

需要每天早上 9 点跑步,并且每 10 秒保持一次跑步

Angular 6 每 X 秒运行一个函数

vb怎么每隔一秒自动点击按钮

如何每 X 秒运行一次方法