我用PYTHON做了个定时采集某网站数据的程序,再cmd里运行,只要cmd最小化到托盘,那么程序运行个2-3次就不运行了,需要我在CMD界面输入键盘按键才能又正常运行。但如果我最大化到桌面,置顶了,他就能一直运行。但是这样我就没办法做其他事了。
本作答参考chatgpt:
可以尝试使用Python中的第三方库schedule来实现定时任务。这个库可以在指定的时间间隔或时间点执行函数。
下面是一个使用schedule库的示例代码:
import schedule
import time
def job():
print("I'm working...")
# 每隔1分钟执行一次job函数
schedule.every(1).minutes.do(job)
while True:
schedule.run_pending()
time.sleep(1)
在这个例子中,我们使用了schedule库来每隔1分钟执行一次job函数。通过while循环和sleep函数,我们保持程序的运行,并在每次循环中调用schedule.run_pending()来检查是否有已经到达的任务需要执行。
另外,您还可以考虑使用Python中的第三方库apscheduler来实现更高级的定时任务,该库支持多种定时任务类型,并且可以将任务调度到不同的进程或线程中执行。
希望这些信息能对您有所帮助!
用pyinstaller 打包成exe 试试看
代码呢
用了大家提供的schedule 还是存在这问题。前面两次定时执行,没啥问题。到了17点11分的时候,我看程序不动了,就在CMD页面按了下Q,结果出来的执行时间(每次执行时,我都输出一次时间)是16点54分的。
引用chatGPT作答,这是因为当您最小化 cmd 窗口时,窗口的焦点会丢失,键盘输入也无法被正确地接收。因此,您需要一种解决方案,可以让程序在窗口最小化时继续运行,而无需键盘输入。
一种解决方案是使用 Python 的第三方库,如 pywinauto 或 pyautogui。这些库允许您自动化对窗口和键盘的控制,从而避免在程序运行期间需要手动输入按键。
例如,您可以使用 pyautogui 库的 hotkey 函数来模拟按下和释放键盘上的某些键。您可以在程序的主循环中定期调用该函数,以确保窗口焦点不会丢失。
以下是一个示例代码片段,演示如何使用 pyautogui 库来模拟按下和释放 Ctrl + Alt + Delete 键:
import pyautogui
import time
# 模拟按下和释放 Ctrl + Alt + Delete 键
pyautogui.hotkey('ctrl', 'alt', 'delete')
# 每隔一段时间执行一次
while True:
# 在这里写你的代码
time.sleep(60) # 等待60秒
如果您使用的是 pywinauto 库,则可以使用 win32api 模块的 keybd_event 函数来模拟按键事件。以下是一个使用 pywinauto 的示例代码片段:
from pywinauto import Application
import win32api
import win32con
import time
# 打开 cmd 窗口
app = Application().start("cmd.exe")
# 获取 cmd 窗口句柄
hwnd = app.top_window().handle
# 模拟按下和释放 Ctrl + Alt + Delete 键
win32api.keybd_event(win32con.VK_CONTROL, 0, 0, 0)
win32api.keybd_event(win32con.VK_MENU, 0, 0, 0)
win32api.keybd_event(win32con.VK_DELETE, 0, 0, 0)
win32api.keybd_event(win32con.VK_CONTROL, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(win32con.VK_MENU, 0, win32con.KEYEVENTF_KEYUP, 0)
win32api.keybd_event(win32con.VK_DELETE, 0, win32con.KEYEVENTF_KEYUP, 0)
# 每隔一段时间执行一次
while True:
# 在这里写你的代码
time.sleep(60) # 等待60秒
希望这些解决方案能帮助您解决问题。
如果是我的话,既然需要在cmd中定时运行python程序,那就没有必要在python中写定时函数,直接写一个bat脚本,在bat脚本中写定时处理代码,定时执行py文件即可,这样就不会因为最小化干扰到程序的正常运行,也不需要额外安装其他的库。
bat脚本的定时操作应该不难,很容易就能搜到,执行py文件就直接写 python main.py就可以
用 pythonw 命令后台运行, 参考: https://www.modb.pro/db/484566
以下内容部分参考ChatGPT模型:
我可以给出一些解决问题的思路。
首先,你可以尝试使用Python中的第三方库"schedule",它可以帮助你实现定时运行任务。这个库可以让你以各种方式设置任务,包括设置任务运行的时间间隔、具体时间等等。
另外,你可以尝试使用Python中的"daemon"模块,它可以让你的程序在后台运行,而不会被命令行关闭或最小化。
最后,你也可以尝试使用Python中的"multiprocessing"模块,它可以让你同时运行多个程序,以避免一个程序被关闭或最小化的情况下停止运行。
下面是一些参考代码:
使用schedule库实现定时运行任务:
import schedule
import time
def job():
print("I'm working...")
schedule.every(10).seconds.do(job)
while True:
schedule.run_pending()
time.sleep(1)
使用daemon模块实现后台运行:
import daemon
import time
def do_something():
while True:
print("I'm working...")
time.sleep(1)
with daemon.DaemonContext():
do_something()
使用multiprocessing模块实现同时运行多个程序:
import multiprocessing
import time
def worker():
while True:
print("I'm working...")
time.sleep(1)
if __name__ == '__main__':
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
for j in jobs:
j.join()
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
你这个问题可能是由于cmd窗口失去焦点时,系统自动将cmd进程降低优先级,导致你的程序被暂停了。你可以通过一些Python库来解决这个问题,如pywin32或pyautogui。
首先,使用pywin32库可以把cmd窗口置顶,并设置为活动窗口:
import win32gui
hwnd = win32gui.GetForegroundWindow()
win32gui.SetWindowPos(hwnd,win32con.HWND_TOPMOST,0,0,0,0,win32con.SWP_NOMOVE|win32con.SWP_NOSIZE)
win32gui.SetForegroundWindow(hwnd)
这个代码将当前窗口设置为置顶和活动窗口。使用这个代码后,当系统将焦点转移到其他窗口时,cmd的进程优先级仍然保持不变。
另外,你可以使用pyautogui模拟一些按键,以便在后台运行时发送热键来保持cmd进程的活动状态。例如:
import pyautogui
# 给cmd窗口发送Alt键
pyautogui.keyDown('alt')
pyautogui.press('tab')
pyautogui.keyUp('alt')
这个代码将发送Alt+Tab键来将焦点从cmd窗口切换到其他窗口,再次按下Alt+Tab键来将焦点切换回cmd。这样,程序就能一直运行了。
最后,你可以将上述代码组合为一个循环,以便程序自动发送按键并保持焦点。如下所示:
while True:
# 给cmd窗口发送Alt键
pyautogui.keyDown('alt')
pyautogui.press('tab')
pyautogui.keyUp('alt')
# 休眠1秒钟
time.sleep(1)
这个代码片段使用一个while循环,在循环中发送Alt+Tab键,并在每次发送后休眠1秒钟,以保持程序的运行。
如果我的回答解决了您的问题,请采纳!
python
import schedule
import time
def job():
# 在这里编写你的数据采集代码
print("采集数据")
schedule.every(10).minutes.do(job) # 每隔10分钟执行一次job函数
while True:
schedule.run_pending()
time.sleep(1)
朋友,楼上的这些回答我帮你看了一下,一楼是可以用的,我帮你分析了解一下你更好补充,望采纳谢谢!
一楼使用了Python的schedule模块,用于定时运行一个函数。下面是代码的解释:
导入schedule和time模块。
定义一个名为“job”的函数,用于运行需要定时执行的程序或任务。在这个例子中,我们只是简单地打印一条消息,表示采集数据。
使用schedule模块的.every()方法设置定时器,该方法需要传递两个参数:时间间隔(以整数表示)和时间单位(例如,minutes表示分钟)。在这个例子中,我们将每分钟运行一次job函数。
在while循环中,使用schedule模块的run_pending()方法检查是否有定时任务需要运行,如果有,则运行它们。
在while循环中,使用time模块的sleep()方法使程序暂停一秒钟,以避免过多消耗CPU资源。
请注意,此代码示例只是一个基本示例。如果您要执行更复杂的任务,请相应调整定时器的设置和job函数的实现方式。
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下。
这个问题可能是由于Cmd窗口失去焦点而导致的,可以尝试使用一些第三方库来实现定时任务,比如APScheduler、schedule等,这些库可以在后台运行,不受Cmd窗口是否失去焦点的影响。
以下是使用APScheduler实现定时任务的示例代码:
from apscheduler.schedulers.blocking import BlockingScheduler
def job():
print('Hello world!')
if __name__ == '__main__':
scheduler = BlockingScheduler()
# 每隔5秒钟执行一次job函数
scheduler.add_job(job, 'interval', seconds=5)
scheduler.start()
以上代码定义了一个名为job的函数,它会每隔5秒钟输出一句"Hello world!"。使用BlockingScheduler来运行定时任务,可以保证任务在后台一直运行,不受Cmd窗口是否失去焦点的影响。
你可以根据自己的需求修改job函数和定时任务的执行时间。如果需要在特定的时间点运行任务,可以使用date参数,如:
scheduler.add_job(job, 'date', run_date='2022-05-01 00:00:00')
这将在2022年5月1日0点整执行job函数。
希望这可以解决你的问题。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
一个是窗口丢失可以用其他平台vs或者py写一个聚焦得程序,或者用autohotkey做一个win得小程序,前台线程掉了后台直接就没有了。
看你什么系统,windows和linux都有自己的定时任务,你只需要把要做的任务写好,用系统自带的定时