我是编码和Python的新手,读过很多关于模块绝对/相对导入的类似问题,但我不明白为什么我的cronjob不起作用。
当我从终端python3 example.py
运行时,程序运行时没有问题。
然而,当我安排一个cronjob运行";例如"py";,由于ImportError,程序无法运行。它第一次失败是由于ModuleNotFound错误,所以我重新安装了有问题的模块(pyautogui(,这似乎解决了这个错误。
我已经尝试使用CCD_ 2而不仅仅是CCD_;ImportError:尝试在没有已知父包的情况下进行相对导入;。
有人能简单地解释一下这里发生了什么吗?或者指出我可以做的阅读方向,以了解terminal/cronjob是如何试图执行我的程序的?
感谢
有人能简单地解释一下这里发生了什么吗?或者指出我可以做的阅读方向,以了解terminal/cronjob是如何试图执行我的程序的?
好的。Crontab程序在不同于终端中的环境下运行。
检查这一点最可靠的方法是从crontab运行这个bash脚本:
#!/bin/bash
set > /tmp/set.txt
它将转储整个环境(可能您只需要$PATH
(/tmp/set.txt";。
从终端运行相同的脚本,保存到不同的文件。如果将两者进行比较,您会注意到差异,例如PATH
。
而且,您已经猜到了,python
使用PATH
来查找它的各种位和块(就这一点而言,如果存在多个,则运行哪个python也取决于PATH(。
在crontab文件中,您应该注意到,在顶部附近,有一个对SHELL
变量和PATH
变量的赋值。这些是以下所有命令使用的值。
您可能应该能够将PATH值设置为从终端获得的相同值,但请记住,您可能会中断同一crontab中任何其他脚本的操作(这就是为什么您应该使用/etc/cron.d
文件(。