crontab在CentOS7.9 Python虚拟环境中定时执行报错,寻求解决方案?

服务系统:CentOS7.9
Python环境:Python3.8.6
项目背景:收银台自动化脚本
我在CentOS7 中创建了一个虚拟环境,自动化交是可以正常执行的。但是当我打算用crontab做定时任务的时候,一直报错。脚本里面用到的这个Browsermob-Proxy是一个代理,可以理解为抓包用的。

ImportError while loading conftest '/home/lawrence/workcode/Auto_Cashierx/conftest.py'.
conftest.py:7: in <module>
    from common.proxy_manager import ProxyManager
common/proxy_manager.py:51: in <module>
    ProxyManager()
common/proxy_manager.py:26: in __init__
    self.server.start()
venv/lib/python3.8/site-packages/browsermobproxy/server.py:127: in start
    raise ProxyServerError("Can't connect to Browsermob-Proxy")
E   browsermobproxy.exceptions.ProxyServerError: Can't connect to Browsermob-Proxy
/bin/sh: allure: 未找到命令
/bin/sh: allure: 未找到命令
Traceback (most recent call last):
  File "run_case.py", line 88, in <module>
    get_result()
  File "run_case.py", line 39, in get_result
    with open("report.json", "r", encoding="utf-8") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'report.json'

(PS: ‘allure: 未找到命令’ ,从这往下都不影响程序执行)

我试过很多种办法,包括直接在crontab里面定义

0 8,15,21 * * * source /home/lawrence/workcode/Auto_Cashier/venv/bin/activate && /home/lawrence/workcode/Auto_Cashier/venv/bin/python3 /home/lawrence/workcode/Auto_Cashier/run_case.py

或者是在sh脚本里面编写

#!/bin/bash
cd /home/lawrence/workcode/Auto_Cashierx/venv/
source ./bin/activate
cd /home/lawrence/workcode/Auto_Cashierx
venv/bin/python run_case.py
deactivate >> /tmp/cron_output.log 2>&1

但最终都会报上面的错误。我直接把crontab里面的内容复制出来,是可以正常执行的。找了一天,没找到解决办法。请求各位的帮助。

阅读 933
avatarAI BotBETA

这个问题似乎与在 CentOS 7.9 的 Python 虚拟环境中执行定时任务有关,并且涉及到 crontab。错误日志显示,程序在尝试启动 Browsermob-Proxy 时出错,并且找不到 'allure' 命令。此外,还有一个文件 'report.json' 找不到的问题。

下面是一些可能的解决方案:

  1. 确保 Browsermob-Proxy 正在运行:错误日志显示,ProxyManager() 在尝试启动 Browsermob-Proxy 时出错。请确保 Browsermob-Proxy 正在运行,或者检查其配置是否正确。
  2. 检查环境变量:在虚拟环境中运行脚本时,需要确保所有的依赖项都在正确的位置。你可以尝试在脚本中打印环境变量,检查是否所有的路径和库都已正确设置。
  3. 检查 'allure' 命令:错误日志显示,找不到 'allure' 命令。你需要确认是否已经在你的环境中安装了 Allure。如果没有,你需要安装它。你可以在你的虚拟环境中使用以下命令安装 Allure:pip install allure-pytest
  4. 检查 'report.json' 文件:另一个错误是找不到 'report.json' 文件。你需要确认这个文件是否在你的脚本尝试读取它的位置存在。如果不在,你需要将它移动到正确的位置,或者修改你的脚本以从另一个位置读取它。
  5. 在 crontab 中使用绝对路径:在你的 crontab 命令中,你正在尝试使用源码路径来运行你的脚本和激活你的虚拟环境。这可能会引发问题,因为你的环境变量可能没有正确设置,或者你的虚拟环境可能没有安装在预期的位置。你可以尝试在你的 crontab 命令中使用脚本和虚拟环境的绝对路径。
  6. 将错误重定向到文件:在你的 crontab 命令中,你可以将错误重定向到一个文件,以便于你查看详细的错误信息。例如,你可以将你的命令修改为:0 8,15,21 * * * source /home/lawrence/workcode/Auto_Cashier/venv/bin/activate && /home/lawrence/workcode/Auto_Cashier/venv/bin/python3 /home/lawrence/workcode/Auto_Cashier/run_case.py 2>> /tmp/cron_error.log

希望这些建议能帮助你解决问题!

1 个回答

crontab默认的工作路径是用户的家目录。你的程序 open("report.json", "r", encoding="utf-8") 这里读取的是一个相对目录下的文件,所以会报找不到文件。
读取 report.json 变成了读取 /用户目录/report.json 这个文件了。

所以可以改成这样子:

0 8,15,21 * * * cd /home/lawrence/workcode/Auto_Cashier && ./venv/bin/python3 run_case.py

你把运行步骤放在sh脚本里面执行,这个看上去是没问题的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏