我目前正在创建一个网络抓取工具来收集我正在从事的项目的数据。然而,我使用的抓取工具使用 Selenium Webdriver 和 Pyautogui,这意味着我在计算机处于活动状态时无法真正使用它。我想做的是有一个功能,当我想使用我的计算机做其他事情时,通过按键(或其他简单的东西)暂停我的程序,然后通过简单的输入恢复我的程序。
我遇到的问题是我希望在程序的每个循环开始时发生这种暂停。这个循环需要很长时间,并且检查按键并没有按照我的预期进行。这也不必是按键。我只是想要一种方法来阻止代码运行,以便我可以在白天执行其他任务,然后在我不在办公桌前时让代码运行。这是我想要实现的类似示例:
import time
paused = False
def observe_keypress_function():
if key_was_pressed:
print('Key has been pressed')
paused = True
while True:
if paused:
input('Waiting for input')
for i in range(1, 10):
print(i)
time.sleep(1)
这是我在循环期间给定 keypress 时正在寻找的输出
1
2
3
4 # Between 4 and 5 is a keypress
Key has been pressed
5
6
7
8
9
Waiting for input
显然,这不需要是这样的函数,但我希望这就是发生的情况。
我尝试使用键盘库,但它对我不起作用。我还认为线程可能有用。这样我就可以随时检测到按键,然后等到循环完成即可暂停。然而,我还没有充分尝试过这是否可行(我也没有那么多线程经验)。
非常感谢您的帮助!
下面是一个非常简单的多线程方法。只需使用一个侦听线程和几个共享事件来暂停和停止整个事情。通过连续 10 秒睡眠来模拟工作时间。输入“q”时停止
import sys
import time
from threading import Thread, Event
pause_event = Event()
stop_event = Event()
def listener():
while True:
s = input()
pause_event.set()
if s.lower().startswith('q'):
stop_event.set()
if stop_event.is_set():
break
def main():
listenthread = Thread(target=listener)
listenthread.daemon = False
listenthread.start()
pause_event.clear()
stop_event.clear()
while True:
if stop_event.is_set():
break
if pause_event.is_set():
pause_event.clear()
pause_event.wait()
pause_event.clear()
continue
time.sleep(10)
stop_event.set()
listenthread.join()
main()