鱼C论坛

 找回密码
 立即注册
查看: 1614|回复: 11

[已解决]python 小程序频繁崩溃退出

[复制链接]
发表于 2023-4-22 20:24:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import keyboard,time
import re
import easygui as gui
a='\\5.txt'
with open(a, 'r') as fin:
    data = fin.readlines()
    #print(data)
    m=0
    for i in data:
                keyboard.wait('F6')
                print(i[:9])
                q=re.findall('\d+',i[:9])[0]
                keyboard.write(q)
                keyboard.press('ENTER')
                time.sleep(1)
                gui.msgbox(i)
                m+=1
                f=open(a, 'w') 
                f.writelines(data[m:])
                f.close()
我写了一个从文本上提取数据等待按‘F6’键 输入到指定的网页文本框的小程序,但有一个问题一直困扰着我。就是这个小程序在后台运行等待按键的过程中,过一段时间就会崩溃自动退出,请教高人如何解决,问题出在哪里
最佳答案
2023-4-23 00:07:01
tianyamingyue 发表于 2023-4-22 20:51
感谢两位老师的回复,try except 这个办法我已经尝试过了。还是会崩溃。我怀疑是keyboard这个库的等待机制 ...

如果您已经尝试过使用 try-except 来捕获异常并进行处理,但仍然无法解决程序崩溃的问题,可能需要进一步排查代码中具体哪一部分引起了程序崩溃的原因。

另外,如果您怀疑是 keyboard 库的等待机制出了问题,可以考虑使用其他库来实现相似的功能。比如 pywin32、pynput 等库也提供了键盘事件监听和模拟按键的接口,建议您可以尝试使用这些库来代替 keyboard 库,看看是否能够解决程序崩溃的问题。

以下是一个使用 pynput 实现按键监听和模拟按键操作的代码示例:
from pynput import keyboard

# 键盘事件回调函数
def on_press(key):
    print('按下按键:%s' % key)

def on_release(key):
    print('释放按键:%s' % key)
    # 如果按下键为 Esc,则停止监听
    if key == keyboard.Key.esc:
        return False

# 创建一个键盘监听器对象
listener = keyboard.Listener(on_press=on_press, on_release=on_release)

# 启动监听器,开始监听键盘事件
listener.start()

# 模拟按键操作
from pynput.keyboard import Key, Controller

keyboard = Controller()
keyboard.press('a')
keyboard.release('a')
keyboard.press(Key.enter)
keyboard.release(Key.enter)

该示例中,首先创建了一个键盘监听器对象,并通过 start() 方法启动监听器,开始监听键盘事件。

然后通过 pynput.keyboard.Controller 类实例化了一个控制器对象,用于模拟按键操作。在示例中,我们模拟了按下 'a' 键和回车键的操作。

最后,在按下 'Esc' 键时停止监听键盘事件,同时程序将会退出。

以下是您提供的代码改用 pynput 实现的示例:
from pynput import keyboard
import re
import easygui as gui

# 键盘事件回调函数
def on_press(key):
    if key == keyboard.Key.f6:
        with open('5.txt', 'r') as fin:
            data = fin.readlines()
            for i in data:
                print(i[:9])
                q = re.findall('\d+',i[:9])[0]
                keyboard.press(q)
                keyboard.release(q)
                keyboard.press(keyboard.Key.enter)
                keyboard.release(keyboard.Key.enter)
                time.sleep(1)
                gui.msgbox(i)

# 创建一个键盘监听器对象
listener = keyboard.Listener(on_press=on_press)

# 启动监听器,开始监听键盘事件
listener.start()

# 程序主动等待退出
listener.join()
在该示例中,我们同样创建了一个键盘监听器对象,并在 on_press() 回调函数中,添加了与原先相同的相关实现。

需要注意的是,在使用 pynput 库时,需要在回调函数中手动控制按下和释放按键的操作,具体可以通过 keyboard.press() 和 keyboard.release() 方法来实现。

最后,为了保持程序一直监听键盘事件的状态,我们使用了 listener.join() 方法来让程序一直运行,直到接收到按下 'Esc' 键的事件才停止运行。

最后,如果您还有任何疑问或者需要帮助,欢迎随时继续向我提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-22 20:25:43 | 显示全部楼层
您好,根据您提供的代码和描述,可能的问题原因有以下几点:

  • 程序运行期间可能存在未预料到的错误导致程序崩溃退出。针对这种情况,建议在您的代码中加入一些异常处理机制,比如使用 try-except 语句来捕获异常并进行相应的处理,避免程序意外退出。
  • 另外,由于您的程序需要不断地等待按键操作,如果长时间处于等待状态,可能会出现程序无响应的现象。为了避免这种情况,可以考虑在等待按键的同时,增加一些与用户交互的逻辑,比如打印一些提示信息或者实时更新界面显示等等。
  • 此外,如果您是在 Windows 操作系统上运行此程序,也可能会因为某些系统设置或第三方软件的干扰而导致程序崩溃。为了避免这种情况,建议关闭其他程序或者重新启动计算机,尝试再次运行程序。


希望以上信息能够对您有所帮助,如有需要请继续追问,我将尽力回答您的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-22 20:26:18 | 显示全部楼层
我明白你的问题,我会尽力帮你解决。

从你提供的代码来看,我没有看到明显的错误,可能的原因有很多,比如内存泄漏、依赖库的问题等。这里有一些建议和改进,希望对你有所帮助:

1. 请确保你安装的库版本是正确的,可以尝试更新或降级这些库以解决可能的兼容性问题。你可以使用以下命令来更新库:

   pip install --upgrade keyboard
   pip install --upgrade easygui
   

2. 你可以尝试在代码中添加异常处理,捕获任何可能导致程序崩溃的异常。这样可以帮助你找到问题所在。例如:

   import traceback

   try:
       # 你的代码(不包括import语句)
   except Exception as e:
       print("异常发生:", e)
       traceback.print_exc()
   

   这样,当程序出现异常时,你可以看到详细的错误信息。这可以帮助你定位问题。

3. 可以考虑使用`with`语句来关闭文件,这样可以确保文件在使用完毕后被正确关闭,避免可能的内存泄漏:

   with open(a, 'w') as f:
       f.writelines(data[m:])
   

4. 如果以上建议都不能解决问题,你可以尝试使用其他库(如`pynput`)来代替`keyboard`库,看看问题是否依然存在。

希望这些建议能对你有所帮助。如果你尝试了这些建议但问题仍然存在,请告诉我具体的错误信息,以便我更好地帮助你解决问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-22 20:51:49 | 显示全部楼层
感谢两位老师的回复,try except 这个办法我已经尝试过了。还是会崩溃。我怀疑是keyboard这个库的等待机制出了 问题。但这个库最大的好处就是可以设置等待,别的几个操作键盘鼠标的库比如pyautogui,等。都不如这个方便。我在试试两位的建议看看能不能成功。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-23 00:07:01 | 显示全部楼层    本楼为最佳答案   
tianyamingyue 发表于 2023-4-22 20:51
感谢两位老师的回复,try except 这个办法我已经尝试过了。还是会崩溃。我怀疑是keyboard这个库的等待机制 ...

如果您已经尝试过使用 try-except 来捕获异常并进行处理,但仍然无法解决程序崩溃的问题,可能需要进一步排查代码中具体哪一部分引起了程序崩溃的原因。

另外,如果您怀疑是 keyboard 库的等待机制出了问题,可以考虑使用其他库来实现相似的功能。比如 pywin32、pynput 等库也提供了键盘事件监听和模拟按键的接口,建议您可以尝试使用这些库来代替 keyboard 库,看看是否能够解决程序崩溃的问题。

以下是一个使用 pynput 实现按键监听和模拟按键操作的代码示例:
from pynput import keyboard

# 键盘事件回调函数
def on_press(key):
    print('按下按键:%s' % key)

def on_release(key):
    print('释放按键:%s' % key)
    # 如果按下键为 Esc,则停止监听
    if key == keyboard.Key.esc:
        return False

# 创建一个键盘监听器对象
listener = keyboard.Listener(on_press=on_press, on_release=on_release)

# 启动监听器,开始监听键盘事件
listener.start()

# 模拟按键操作
from pynput.keyboard import Key, Controller

keyboard = Controller()
keyboard.press('a')
keyboard.release('a')
keyboard.press(Key.enter)
keyboard.release(Key.enter)

该示例中,首先创建了一个键盘监听器对象,并通过 start() 方法启动监听器,开始监听键盘事件。

然后通过 pynput.keyboard.Controller 类实例化了一个控制器对象,用于模拟按键操作。在示例中,我们模拟了按下 'a' 键和回车键的操作。

最后,在按下 'Esc' 键时停止监听键盘事件,同时程序将会退出。

以下是您提供的代码改用 pynput 实现的示例:
from pynput import keyboard
import re
import easygui as gui

# 键盘事件回调函数
def on_press(key):
    if key == keyboard.Key.f6:
        with open('5.txt', 'r') as fin:
            data = fin.readlines()
            for i in data:
                print(i[:9])
                q = re.findall('\d+',i[:9])[0]
                keyboard.press(q)
                keyboard.release(q)
                keyboard.press(keyboard.Key.enter)
                keyboard.release(keyboard.Key.enter)
                time.sleep(1)
                gui.msgbox(i)

# 创建一个键盘监听器对象
listener = keyboard.Listener(on_press=on_press)

# 启动监听器,开始监听键盘事件
listener.start()

# 程序主动等待退出
listener.join()
在该示例中,我们同样创建了一个键盘监听器对象,并在 on_press() 回调函数中,添加了与原先相同的相关实现。

需要注意的是,在使用 pynput 库时,需要在回调函数中手动控制按下和释放按键的操作,具体可以通过 keyboard.press() 和 keyboard.release() 方法来实现。

最后,为了保持程序一直监听键盘事件的状态,我们使用了 listener.join() 方法来让程序一直运行,直到接收到按下 'Esc' 键的事件才停止运行。

最后,如果您还有任何疑问或者需要帮助,欢迎随时继续向我提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 19:10:58 | 显示全部楼层
歌者文明清理员 发表于 2023-4-23 00:07
如果您已经尝试过使用 try-except 来捕获异常并进行处理,但仍然无法解决程序崩溃的问题,可能需要进一步 ...

谢谢您的回复,我昨天在家里的电脑上调试程序没有崩溃,但今天去单位的电脑上调试,还是依然崩溃。但有一个错误提示。
Traceback (most recent call last):
  File "_ctypes/callbacks.c", line 237, in 'calling callback function'
  File
"C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\lib\site-packa
ges\keyboard\_winkeyboard.py", line 548, in low_level_keyboard_handler
    return CallNextHookEx(None, nCode, wParam, lParam)
OSError: exception: access violation writing 0x000D0000
Traceback (most recent call last):
  File "_ctypes/callbacks.c", line 237, in 'calling callback function'
  File
"C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\lib\site-packa
ges\keyboard\_winkeyboard.py", line 548, in low_level_keyboard_handler
    return CallNextHookEx(None, nCode, wParam, lParam)
OSError: exception: access violation writing 0x000D0000
Traceback (most recent call last):
  File "_ctypes/callbacks.c", line 237, in 'calling callback function'
  File
"C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\lib\site-packa
ges\keyboard\_winkeyboard.py", line 548, in low_level_keyboard_handler
    return CallNextHookEx(None, nCode, wParam, lParam)
OSError: exception: access violation writing 0x00000000
Traceback (most recent call last):
  File "_ctypes/callbacks.c", line 237, in 'calling callback function'
  File
"C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\lib\site-packa
ges\keyboard\_winkeyboard.py", line 548, in low_level_keyboard_handler
    return CallNextHookEx(None, nCode, wParam, lParam)
OSError: exception: access violation writing 0x00000000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 21:12:46 | 显示全部楼层
歌者文明清理员 发表于 2023-4-23 00:07
如果您已经尝试过使用 try-except 来捕获异常并进行处理,但仍然无法解决程序崩溃的问题,可能需要进一步 ...

您给的这个代码我试了一下,发现每次按一下f6键他会把所有的数据全部打印出来,不是我原来设计的按一次输出一行数据。感觉这个pynput库设置等待按键好复杂。非常感谢您在百忙中抽出时间回复我。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-23 21:17:40 | 显示全部楼层
这种情况很可能是因为长时间运行导致的内存泄漏或者是其他程序中断了你的程序的运行。我建议你试着使用 try-except 语句来进行异常处理,以便你能够及时获取和处理错误。

具体做法如下:将你的程序放入 try 块中,并添加 except 语句以捕获可能发生的错误,如下所示:

import keyboard,time
import re
import easygui as gui

try:
    a='\\5.txt'
    with open(a, 'r') as fin:
        data = fin.readlines()
        #print(data)
        m=0
        for i in data:
            keyboard.wait('F6')
            print(i[:9])
            q=re.findall('\d+',i[:9])[0]
            keyboard.write(q)
            keyboard.press('ENTER')
            time.sleep(1)
            gui.msgbox(i)
            m+=1
            f=open(a, 'w')
            f.writelines(data[m:])
            f.close()
except Exception as e:
    print('Error:', e)
这样,即使出现错误程序也不会直接退出,而是会抛出错误并输出错误信息。这样你就可以根据错误信息定位和解决问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-24 20:09:51 | 显示全部楼层
冷冻哈密瓜 发表于 2023-4-23 21:17
这种情况很可能是因为长时间运行导致的内存泄漏或者是其他程序中断了你的程序的运行。我建议你试着使用 try ...

感谢回复,我明天在单位的电脑上试试看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-25 22:08:35 | 显示全部楼层
冷冻哈密瓜 发表于 2023-4-23 21:17
这种情况很可能是因为长时间运行导致的内存泄漏或者是其他程序中断了你的程序的运行。我建议你试着使用 try ...

我尝试了一下,还是报错,信息与我上面发布的相同。就是这个
"C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\lib\site-packa
ges\keyboard\_winkeyboard.py", line 548, in low_level_keyboard_handler
    return CallNextHookEx(None, nCode, wParam, lParam)
OSError: exception: access violation writing 0x00000000
但是我不太理解含义。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-4 19:09:58 | 显示全部楼层
没人理我了。哎,鱼c论坛越来越冷清了。我的那个问题还是没有解决,单位的两种电脑,一种是64位的运行上述程序没问题,不会自动崩溃,32位每次都自动崩溃。难道是系统问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-4 20:20:16 | 显示全部楼层
歌者文明清理员 发表于 2023-4-23 00:07
如果您已经尝试过使用 try-except 来捕获异常并进行处理,但仍然无法解决程序崩溃的问题,可能需要进一步 ...

wc,兄弟,可以呀,追上来了

加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 09:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表