我有一个简单的python脚本,用于捕获运行Ubuntu的计算机的屏幕截图。我希望它在启动时自动运行,所以我将@reboot python3 /bin/program.py
放在crontab的非sudo版本中。
从终端运行时,程序运行正常,但显示错误pyscreenshot.err.FailedBackendError
。我将其放在try循环中,并让它将所有异常写入文件,这就是我发现错误消息“所有后端均失败”的方式。
与程序'pyscreenshot'无法正常工作有关。
import pyscreenshot as screen
import os
from numpy import random
from time import sleep
from os.path import expanduser
TMP_SCREEN_PATH = expanduser('~') + '/.UE/tmp.png'
LOG_FILE_PATH = expanduser('~') + '/.UE/log.txt'
GRAB_DELAY_RANGE = (1, 10)
def screenshot(save_path=TMP_SCREEN_PATH):
img = screen.grab()
img.save(save_path)
def delay(delay_range):
sleep_time = random.randint(delay_range[0], delay_range[1])
print(f"Sleeping for {sleep_time} seconds")
sleep(sleep_time)
def main():
try:
while True:
screenshot()
delay(GRAB_DELAY_RANGE)
except KeyboardInterrupt:
print("Nope")
main()
except Exception as e:
print(e)
with open(LOG_FILE_PATH, 'a') as f:
f.write(str(type(e))+str(e)+'\n')
sleep(5)
main()
f = open(LOG_FILE_PATH, 'w+')
f.write('Startup')
f.close()
main()
我需要以下解决方案之一:
感谢您的任何帮助,谢谢
如果运行cron作业的用户也已在控制台上登录(您提到了重新启动,所以我猜您已启用自动登录),那么如果您还添加cron作业,则可能会起作用:
os.environ["DISPLAY"] = ":0"
这在Ubuntu上使用cron和脚本的简化版本进行了测试:
import os
import pyscreenshot as screen
os.environ["DISPLAY"] = ":0"
img = screen.grab()
img.save("/tmp/test.png")
如果不适合您,那么您可能还必须尝试将XAUTHORITY
环境变量的值设置为在用户交互过程的环境中找到的值,可以使用psutil
提取该值。包,但我们希望不需要。