Crontab无法在Mac OS上运行Python

3
我已经查找了每一个答案并尝试了所有方法,但我仍然无法让我的crontab运行python。我甚至创建了一个shell脚本来运行Python,认为隔离可以帮助解决问题,但它仍然不起作用。
我的crontab中有以下条目:
* * * * * echo "hello" >> /tmp/test2.txt
* * * * * work.sh

第一行仅每分钟运行一次,以便我可以验证cron是否正在运行。 我已经验证过它正在运行。 每分钟我都会在test2.txt中看到一个新的“hello”

第二行运行名为work.sh的以下脚本

#! /usr/bin/env zsh
echo "Hello World!" >> /tmp/test2.txt
/opt/miniconda3/bin/python3.7 hellopy.py

hellopy.py然后将"Hello from Python"写入test2.txt文件,就像这样:

with open('/tmp/test2.txt','a') as test_txt:
        test_txt.write("Hello from Python")

当我手动运行work.sh时,我在test2.txt中得到了我期望的内容。
Hello World!
Hello from Python

然而,当我让cron运行一段时间并查看test.txt文件时,我只能看到来自直接cron行的条目以及work.sh中的echo命令。Python行不会将内容写入该文件。"Hello from Python"这段文本不会显示出来。

hello
Hello World!
hello
Hello World!
hello
Hello World!

我已检查了Python文件-rwxr-xr-x和文本文件-rwxrwxrwx 的权限,它们看起来都很好。

所以我知道:

  1. Python代码可以工作;
  2. Shell脚本可以成功运行Python代码;
  3. Crontab正在运行;
  4. Crontab可以运行Shell脚本;
  5. 通过Crontab运行Shell脚本时,部分脚本的执行是正确的。

但由于某种原因,当Crontab运行Shell脚本时,Python命令不起作用。我还尝试了以下几种方法,但都没有成功:

  1. 直接在Crontab中的一行中运行Python脚本,而不是通过Shell脚本;
  2. 在Shebang中使用“bash”而不是“zsh”;
  3. 使用位于不同路径/usr/bin/python3下的其他Python副本。

在所有的搜索中,我找到的解决方案都与文件权限和绝对路径有关。我已经尝试了所有可能的组合,但似乎没有帮助。我完全被卡住了,任何帮助将不胜感激。


1
你认为脚本的工作目录是什么?hellopy.py在哪里? - adrtam
我将脚本和 hellopy.py 都放在 /usr/local/bin 中,以避免混淆。我这样做是因为我也在那里有 Python,这样一切都在同一个目录中,避免混淆。我还检查了一下,确保 /usr/local/bin 在执行路径中。 - maderman
请检查cron是否已经通过mail发送了一封邮件(例如:它将被发送到您本地机器的收件箱中),指示未找到hello.py - chepner
如果您将脚本放在 /usr/local/bin 中,为什么不在 work.sh 中使用完整路径呢?此外,我怀疑 cron 是否会使用您的 $PATH 设置。 - adrtam
@adrtam 我认为这取决于涉及哪个crontab:/etc/crontab,还是来自/usr/lib/cron/tabs的特定用户crontab。如果您运行crontab -e,后者将被修改。 - chepner
显示剩余3条评论
1个回答

1

以下是@chepner的解决方案:

问题在于cron期望在我的主目录中找到python文件,但我将python文件保存在另一个目录中。一旦我将该文件移动到主目录中,一切都正常了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接