Python 我的程序直接从终端正常运行,但在使用crontab启动程序时,出现ImportError或ModuleNotFound错误

Python 我的程序直接从终端正常运行,但在使用crontab启动程序时,出现ImportError或ModuleNotFound错误,python,Python,我不熟悉编码和Python,读过很多关于模块绝对/相对导入的类似问题,但我无法理解为什么我的cronjob不起作用 当我从终端运行时:python3 example.py程序运行没有问题 但是,当我计划一个cronjob运行“example.py”时,由于一个错误,程序无法运行。它第一次失败是由于ModuleNotFound错误,所以我重新安装了有问题的模块(pyautogui),它似乎解决了这个错误 我试过使用来自的。导入pyautogui、os、time、smtplib、traceback而

我不熟悉编码和Python,读过很多关于模块绝对/相对导入的类似问题,但我无法理解为什么我的cronjob不起作用

当我从终端运行时:
python3 example.py
程序运行没有问题

但是,当我计划一个cronjob运行“example.py”时,由于一个错误,程序无法运行。它第一次失败是由于ModuleNotFound错误,所以我重新安装了有问题的模块(pyautogui),它似乎解决了这个错误

我试过使用来自的
。导入pyautogui、os、time、smtplib、traceback
而不是只导入xyz,但会出现“ImportError:在没有已知父包的情况下尝试相对导入”

有人能简单地解释一下这里发生了什么吗?或者为我指出阅读的方向,以了解terminal/cronjob是如何尝试执行我的程序的

谢谢

有人能简单地解释一下这里发生了什么吗?或者为我指出阅读的方向,以了解terminal/cronjob是如何尝试执行我的程序的

好的。Crontab程序在与终端不同的环境下运行

最可靠的检查方法是从crontab运行此bash脚本:

#!/bin/bash
set > /tmp/set.txt
它会将整个环境(可能您只需要
$PATH
)转储到“/tmp/set.txt”

从终端运行相同的脚本,保存到不同的文件。如果比较两者,您会注意到差异,例如在
路径中

而且,您已经猜到了,
python
使用
PATH
来查找它的各个位和片段(对于这一点,如果存在多个python,则运行哪个python也取决于路径)

在crontab文件中,您应该注意到靠近顶部的
SHELL
变量和
PATH
变量的赋值。这些是以下所有命令使用的值

您应该能够将路径值设置为从终端获得的相同值,但请记住,您可能会中断同一crontab中任何其他脚本的操作(这就是为什么您应该使用
/etc/cron.d
文件)

有人能简单地解释一下这里发生了什么吗?或者为我指出阅读的方向,以了解terminal/cronjob是如何尝试执行我的程序的

好的。Crontab程序在与终端不同的环境下运行

最可靠的检查方法是从crontab运行此bash脚本:

#!/bin/bash
set > /tmp/set.txt
它会将整个环境(可能您只需要
$PATH
)转储到“/tmp/set.txt”

从终端运行相同的脚本,保存到不同的文件。如果比较两者,您会注意到差异,例如在
路径中

而且,您已经猜到了,
python
使用
PATH
来查找它的各个位和片段(对于这一点,如果存在多个python,则运行哪个python也取决于路径)

在crontab文件中,您应该注意到靠近顶部的
SHELL
变量和
PATH
变量的赋值。这些是以下所有命令使用的值


您应该能够将路径值设置为从终端获得的相同值,但请记住,您可能会中断同一crontab中任何其他脚本的操作(这就是为什么您应该使用
/etc/cron.d
文件)。

非常感谢您的帮助。正如您所说,我创建的两个bash文件中的路径不同。我在TextEdit中打开了crontab文件,它只有一行文本(要运行的程序的时间和路径名)。我可以用纯文本将PATH变量添加到此文件的顶部吗?我不知道如何使用/etc/cron.d文件,但会进行调查。非常感谢您的帮助。正如您所说,我创建的两个bash文件中的路径不同。我在TextEdit中打开了crontab文件,它只有一行文本(要运行的程序的时间和路径名)。我可以用纯文本将PATH变量添加到此文件的顶部吗?我不知道如何使用/etc/cron.d文件,但将对此进行调查。