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

问题描述 投票:0回答:5

我正在从 python 库运行一个 python 脚本,该脚本使用 dotenv 从库根目录中的

.env
文件加载一些环境变量。

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

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

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

有什么想法为什么这不起作用吗?

非常感谢您的帮助!

python variables cron environment dotenv
5个回答
9
投票

我也使用 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)

来源


2
投票

我不知道是否有更优雅的解决方案。 通过在 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


2
投票

如果您使用

dotenv
的默认配置路径,则它是从
path.resolve(process.cwd(), '.env')
解析的,当从
cron
运行脚本时,不会解析为您期望的内容。

因此,如果您的

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

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

0
投票

Node.js ES6 方式,无需任何外部模块:

// env.js
import dotenv from 'dotenv'
const _dirname = new URL('.', import.meta.url).pathname
dotenv.config({ path: _dirname + '.env' })
// yourmodule.js
import _ from './env.js'

// use process.env

0
投票

如果您像我一样正在与多个因素作斗争,那么可能会遇到几个问题。确实,对于纯粹的 Linux 系统管理员来说,从 cron 加载 env 很麻烦,而且可能存在安全风险,即使在容器中也是如此。但是如果您使用 dotenv,问题可能是加载 dotenv 中的绝对路径(crontab 不知道您的 .env 在哪里)、一些基本日志记录(以查看真正的错误是什么)以及最后的 crontab 的组合用户需要安装 pip!

尝试:

  1. 在python脚本中显式设置env的路径:
    envpath = join(dirname('/var/www/node-folder/approot/'), '.env')
  2. 在 crontab 中,确保记录错误!
    * * * * * sudo -H PYTHONPATH=/usr/bin/python3 /usr/bin/python3 /var/www/node-folder/approot/app.py >> /var/log/app.log 2>&1
  3. 你猜怎么着? sudo 或任何可能没有点数的用户!

示例:

    from sqlalchemy import create_engine,text
ModuleNotFoundError: No module named 'sqlalchemy'```
© www.soinside.com 2019 - 2024. All rights reserved.