无法从 cron 作业中找到 dotenv 环境变量

Posted

技术标签:

【中文标题】无法从 cron 作业中找到 dotenv 环境变量【英文标题】:Can't find dotenv environment variables from cron job 【发布时间】:2020-10-23 09:30:09 【问题描述】:

我正在从 python 库运行 python 脚本,该脚本使用 dotenv 从库根目录中的 .env 文件加载一些环境变量。

这可以从命令行运行,但是当我尝试使用以下命令作为 cronjob 运行时:

* * * * * source ./path_to_venv/activate; python ./path_to_script.py

我收到一个关键错误,因为它找不到环境变量。

任何想法为什么这不起作用?

非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

如果您使用dotenvs 默认配置路径,它会从path.resolve(process.cwd(), '.env') 解析,当从cron 运行您的脚本时,它不会解析为您所期望的。

因此,如果您的 .env 文件与您的脚本处于同一级别,请使用此示例:

const dotenv = require('dotenv')
dotenv.config( path: __dirname + '/.env' )

【讨论】:

【参考方案2】:

我也在使用 crontab 来执行我的 Node JS 项目。我必须像这样明确声明我的.env 文件的路径:

require('dotenv').config( path: '/var/www/html/myproject/.env' );

在 python-dotenv 中,我相信它可以通过使用类似的方式完成:

# OR, explicitly providing path to '.env'
from pathlib import Path  # Python 3.6+ only
env_path = Path('.') / '.env'
load_dotenv(dotenv_path=env_path)

Source

【讨论】:

【参考方案3】:

我不知道这个是否有更优雅的解决方案。 通过在 cronjob 顶部添加环境变量,我能够使我的脚本在 crontab 中运行。

API_KEY=value
API_KEY_SECRET=value
ACCESS_TOKEN=value=value
ACCESS_TOKEN_SECRET=value

# run on 8hrs interval
0 */8 * * * . $HOME/Coding/python/web-scraper-corona/venv/bin/activate && $HOME/Coding/python/web-scraper-corona/venv/bin/python3 /home/chan-dev/Coding/python/web-scraper-corona/twitter-covid19-bot.py >> /tmp/test.txt 2>&1

【讨论】:

以上是关于无法从 cron 作业中找到 dotenv 环境变量的主要内容,如果未能解决你的问题,请参考以下文章

你怎么得到运行Node.js脚本的cron作业从.env文件中读取变量?

无法读取Dotenv.php中的“../.dev.env”环境文件:symfony

AWS 上的 Cron(或一般的分布式系统)

使用firebase和app引擎创建一个关闭的cron作业

如何找到特定的 cron 工作?

cron 作业无法读取以前的 cron 日志