使用 Crontab 到 运行 简单 Python 文件

using Crontab to run simple Python file

我正在尝试使用 crontab 运行 一个简单的 Python 脚本,但我无法让它工作。我可以在不使用 Python 时在 crontab 中 运行 一个简单的程序。这是我的 Crontab 文件中有效的行:

* * * * * echo “cron test” >> /home/ftpuser/dev/mod_high_lows/hello.txt

我也可以 运行 这个 python 脚本 testit.py 直接从命令行。这是我的 testit.py 输出 csv 文件的文件。

#!/usr/bin/env python

import f_file_handling
_data = [(12,15,17)]
f_file_handling.csv_out('my_file_test',_data)

上面的文件有一个我创建的函数,但我知道它可以工作,因为当我从命令行 运行 testit.py 时,它会按照我的预期运行,如下所示:

python testit.py

所以我让 Crontab 自己工作,让 testit.py 文件自己工作,然后我尝试用 Crontab 运行 testit.py 文件。 我确实使用以下命令使 testit.py 文件可执行:

chmod +x testit.py 

我看到了它的可执行文件,因为当我在正确的目录中时,该文件在我的 linux 命令 window 中显示为绿色。 现在,在我用于 运行 早期 Crontab 测试的同一个 Crontab 文件中,我添加了以下行:

* * * * * /home/ftpuser/dev/mod_high_lows/testit.py

是的,我想每分钟都执行一次,只是想 运行 最简单的测试,让 Crontab 和 Python 一起工作。

这是我正在使用的:

以上是在我设置的 linux 服务器上。

你在我的 testit.py 文件的顶部看到了 shebang 行,根据我的研究,这应该有效。
至于我的 testit.py python 文件,我是写在 windows 机器上然后传到服务器上的,但是当 crontab 和 python 没有一起工作时我也使用 Nano 文本编辑器从 Linux 命令 window 对文件进行编码,但这在尝试通过 Crontab 运行 testit.py 文件时没有任何区别。所以它不会 运行 即使我直接在 Linux 服务器上编写 testit.py 代码(以防万一 windows 在我的文件中创建隐藏字符)。

我不确定这是否有帮助,但我总是通过将此行添加到 crontab 文件的末尾,成功地从 cron 成功获取 python 脚本到 运行 :

@reboot python /home/ftpuser/dev/mod_high_lows/testit.py &

行尾必须有&。如果这是您所需要的,并且您希望此脚本每分钟执行一次,则可以将整个脚本放入一个循环中,然后在每个循环迭代结束时休眠一分钟。

您可能还需要在 python 之前放置一个 sudo,尽管 crontabs 无论如何都应该 运行 作为 root,所以这可能不是必需的。不过,此方法对我的 Raspberry Pi 启动时的 运行ning 脚本有效。

  • cron 在受限环境中运行命令。只有几个环境变量 自动设置。它加载由 /etc/environment 指定的环境 和 /etc/security/pam_env.conf,但与您的环境变量无关 可能已在您的 .bashrc.profile.

    中设置

    设置crontab条目

    *   *    *    *    *   /usr/bin/env > /tmp/out
    

    看看实际设置了哪些环境变量。 不要忘记在 /tmp/out.

  • 后删除 crontab 条目
  • 当运行Python脚本时,一个重要的环境变量,你会 大概需要设置的是PYTHONPATH。所以在你的 crontab 的顶部添加一个 PYTHONPATH 设置如:

    PYTHONPATH=/home/ftpuser/dev/mod_high_lows
    

    一定要添加包含f_file_handling模块的目录,这样 Python 会在运行语句

    时找到模块
    import f_file_handling
    
  • 最后,还要注意默认cron runs commands in your home directory。 然而,最好是明确的,并在脚本中指定文件时提供完整路径:

    f_file_handling.csv_out('/path/to/my_file_test',_data)
    

有一件事总是让我很困惑:你必须在 crontab 文件的末尾留一个空行。 cron不会运行crontab的最后一行!