即使使用 sudo pip install 运行 cron 作业时也找不到 Python 包

即使使用 sudo pip install 运行 cron 作业时也找不到 Python 包

这是我的 crontab 命令:

*/15 * * * * cd /home/ec2-user/SageMaker && /bin/bash /home/ec2-user/SageMaker/churn_end_to_end_pipeling_actionable.sh

在我的邮件中,我收到以下错误:

Message-Id: <[email protected]>
X-Authentication-Warning: ip-172-16-124-135.ec2.internal: ec2-user set sender to root using -f
From: [email protected] (Cron Daemon)
To: [email protected]
Subject: Cron <ec2-user@ip-172-16-124-135> cd /home/ec2-user/SageMaker && /bin/bash /home/ec2-user/SageMaker/churn_end_to_end_pipeling_actionable.sh
Content-Type: text/plain; charset=UTF-8
Auto-Submitted: auto-generated
X-Cron-Env: <LANG=en_US.UTF-8>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/ec2-user>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=ec2-user>
X-Cron-Env: <USER=ec2-user>

Traceback (most recent call last):
  File "feature_engineering.py", line 9, in <module>
    import seaborn as sns
ImportError: No module named seaborn
Traceback (most recent call last):
  File "generate_churn_outputs_actionable.py", line 5, in <module>
    from xgboost import XGBClassifier
ImportError: No module named xgboost

我不确定为什么我会遇到这个错误,因为我sudo -H pip install <package>在运行 cron 作业之前就已经遇到过。

另外,这里是我的 bash 脚本及其引用的 python 脚本的内容:

重击:

#!/bin/bash

python feature_engineering.py 
python generate_churn_outputs_actionable.py 1

脚本 1 和 2:

#! /home/ec2-user/anaconda3/envs/JupyterSystemEnv/bin/python

任何帮助都将不胜感激。此外,如果我遗漏了任何细节,请告诉我,我会添加。

答案1

我在 Ubuntu 18.04 上遇到了同样的问题,使用 crontab 中的显式路径不起作用。出于某种原因,cron 不起作用,而我帐户中的 sudo 起作用。我本以为它们会相同,但可惜它们不是。我得出的结论是,这是一个环境变量问题。

您可以通过运行以下命令模拟 sudo 中的 cron 问题:

sudo bash -c "HOME=FOO;python3 -c \"import xgboost\""

对于我来说,解决方法是让 crontab 调用一个 shell 脚本,然后执行 python 脚本。还必须设置python 路径环境变量:

crontab:

# Execute shell script and pipe stdout and stderr to a log file
# Which will enable you to see what's going on in real time
* * * * * <your_path>/yourscript.sh  >> <your_path>yourscript_cron.log 2>&1

你的脚本.sh:

#!/bin/bash
echo yourscript.sh called: `date`
HOME=<your_home_dir>
PYTHONPATH=<path_to_dist_packages>
cd <path_to_your_python_script>
<python_executable> ./<your_python_script> 2>&1 1>/dev/null

相关内容