python 包不适用于从 cron 执行的脚本
Posted
技术标签:
【中文标题】python 包不适用于从 cron 执行的脚本【英文标题】:python packages not available to script executed from cron 【发布时间】:2019-03-01 16:08:33 【问题描述】:我开发了一个 python Flask API 并将其部署在 aws ebs 上。
Flask API 按预期工作。 Flask API 需要我安装的几个 python 包,方法是将它们添加到:
requirements.txt
我还安装了一个 python 脚本,它是与 Flask API 分开的 py 文件。它计划每天运行,由 cron 执行。
当我设置 cron 时,我得到一个找不到模块的执行错误:
ModuleNotFoundError: No module named 'pandas'
但是模块是由requirements.txt
安装的,并且可用于 Flask API 代码。 import pandas
是如何与 Flask API 一起工作,但无法用于由 cron 执行的 python 脚本的?
【问题讨论】:
您的代码是否在虚拟环境中运行,如果是,cron 条目是否设置为在同一环境中运行? 您可能需要将您的 cron 行设置为workon myenv && python /path/to/script.py
【参考方案1】:
@arudzinska 是对的。我的案例是使用 Elastic Beanstalk AWS 和 cronjob,它们与 pandas 有相同的问题(没有名为“pandas”的模块)。 我使用上面的 cmets 并尝试找到 pandas 包的位置,然后找到安装 requirements.txt 包的 python 路径并将它们全部放在 .config 文件中: 1. 熊猫路径:
find . -name pandas
./opt/python/run/venv/lib64/python3.6/site-packages/pandas
-
Python 路径
2.1。进入控制台的系统路径是什么
eb ssh
which python3
/usr/bin/python3
2.2。找到你的 python 路径
find . -name python
./opt/python/run/baselineenv/bin/python ./opt/python/run/venv/bin/python
应用文件
find . -name apps.py
/opt/python/current/app/apps.py
-
修改了 .ebextensions 处的 cronjob.config 文件
files:
"/etc/cron.d/mycron":
mode: "000644"
owner: root
group: root
content: |
15 6 * * * root echo $(date) >> /tmp/cron.log; /usr/local/bin/myscript.sh >> /tmp/cron_py.log 2>&1;
"/usr/local/bin/myscript.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
date > /tmp/date
# Your actual script content
/opt/python/run/venv/bin/python3 /opt/python/current/app/apps.py
exit 0
命令: remove_old_cron: 命令:“rm -f /etc/cron.d/mycron.bak”
现在一切正常。
【讨论】:
【参考方案2】:Cron 作业在您的环境之外运行,这意味着它们没有您的 $PATH
和其他环境变量(this 答案中的更广泛描述),这使得无法找到某些程序。你应该做的是让你的 Python 脚本执行包装在一个 bash 脚本中,在开始时你导出所有需要的环境变量(或者通常让它使用你的环境)。然后,用你的 cron 执行这个 bash 脚本。
【讨论】:
以上是关于python 包不适用于从 cron 执行的脚本的主要内容,如果未能解决你的问题,请参考以下文章