每 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 而无需重新打开选项卡的主要内容,如果未能解决你的问题,请参考以下文章