gpt4 book ai didi

python - 一段时间后Python脚本停止

转载 作者:行者123 更新时间:2023-12-01 13:39:59 25 4
gpt4 key购买 nike

我有一个带有raspbian的raspberry pi,并且我已经创建了一个python脚本,该脚本需要一直运行。问题是运行一个小时左右后,脚本突然停止,并且python进程关闭。我不知道为什么,而且我是Linux的新手,所以我不知道如何调试它或任何东西。我不认为这是内存问题,因为在while循环中,我释放并重新初始化了所有使用的对象。我如何找出问题所在,或者至少在程序停止后自动重启?

这是代码:

import time
import sys
import ftputil
import pygame
import pygame.camera
import logging

pygame.camera.init()
#pygame.camera.list_camera() #Camera detected or not
cam = pygame.camera.Camera("/dev/video0",(640,480))
count = 5
logging.basicConfig(filename='log.log', level=logging.INFO)
logging.info(str(time.time())+" : Script was started")

while True:
cam.start()
img = cam.get_image()
pygame.image.save(img,"current.jpeg")
cam.stop()
host = ftputil.FTPHost(**)
host.upload("./current.jpeg", "/domains/*/public_html/webcam.jpg", mode='b')
host.close()
if not count:
host = ftputil.FTPHost(**)
filename = str(time.time()) + ".jpg"
host.upload("./current.jpeg", "/webcamarchive/"+filename, mode='b')
host.close()
count = 10
logging.info(str(time.time())+": Still running")
count -= 1
time.sleep(3)

我从ssh运行脚本。但是我也想在计算机启动时启动它,我该怎么做?

最佳答案

不用担心每次计算机启动时都使其运行,直到您可以使其在正常的登录 session 中连续运行。

如果要将ssh插入计算机并启动它,只需将ssh session 保持打开状态,然后观察打印出来的内容。如果由于某种原因无法执行此操作,请通过执行操作来捕获输出,例如python foo.py >foo.out 2>foo.err而不是python.py。无论哪种方式,您都可以查看为什么停止,而不仅仅是知道它已停止。

您还应该查看在代码中显式创建的log.log文件和syslog(在大多数Linux发行版中默认为/var/log/syslog),以查看是否存在任何相关内容。

另外,请确切告诉我们您是如何“从ssh运行脚本”的。如果您要使用&作为背景,或将其作为ssh命令发送等,则需要修改以上说明。 (但是您不必等待修改后的版本,只需将ssh放入普通的登录脚本中一次,无需后台运行它,然后使其运行即可。)

到目前为止,仅凭您提供给我们的信息,就不可能确切知道发生了什么。但是我的第一个猜测是,您遇到了未处理的异常,您会将其视为异常回溯,如下所示:

Traceback (most recent call last):
File "exc.py", line 7, in <module>
foo()
File "exc.py", line 5, in foo
print(1/x)
ZeroDivisionError: integer division or modulo by zero

解决办法是处理它。最简单的修复方法是这样的:
while True:
try:
cam.start()
img = cam.get_image()
pygame.image.save(img,"current.jpeg")
cam.stop()
host = ftputil.FTPHost(**)
host.upload("./current.jpeg", "/domains/*/public_html/webcam.jpg", mode='b')
host.close()
if !count:
host = ftputil.FTPHost(**)
filename = str(time.time()) + ".jpg"
host.upload("./current.jpeg", "/webcamarchive/"+filename, mode='b')
host.close()
count = 10
logging.info(str(time.time())+": Still running")
count -= 1
except Exception as e:
logging.error('Caught exception: ' + str(e))
time.sleep(3)

但是,最好检查一下可能遇到的每种异常,或者查看实际遇到的异常,并在每个位置进行适当的错误处理和登录,并仅将其用作最后一种。沟后备。

另外,您应该真正使用 with子句,而不是手动的 close调用。例如,如果 host.upload()升高,则 host.close()将永远不会被调用。因此,代替此:
host = ftputil.FTPHost(**)
host.upload("./current.jpeg", "/domains/*/public_html/webcam.jpg", mode='b')
host.close()

做这个:
with contextlib.closing(ftputil.FTPHost(**)) as host:
host.upload("./current.jpeg", "/domains/*/public_html/webcam.jpg", mode='b')

(许多类型甚至都不需要 closing,因为它们已经固有地是上下文管理器,因此请首先尝试该方法,但是如果您收到有关 ftputil.FTPHost没有 __enter____exit__的错误,则可以使用该方法。)

关于python - 一段时间后Python脚本停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13998496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com