我正在从 python 库运行一个 python 脚本,该脚本使用 dotenv 从库根目录中的
.env
文件加载一些环境变量。
这可以从命令行运行,但是当我尝试使用以下命令作为 cronjob 运行时:
* * * * * source ./path_to_venv/activate; python ./path_to_script.py
我收到一个关键错误,因为它找不到环境变量。
有什么想法为什么这不起作用吗?
非常感谢您的帮助!
我也使用 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)
我不知道是否有更优雅的解决方案。 通过在 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
如果您使用
dotenv
的默认配置路径,则它是从 path.resolve(process.cwd(), '.env')
解析的,当从 cron
运行脚本时,不会解析为您期望的内容。
因此,如果您的
.env
文件与脚本处于同一级别,请使用此示例:
const dotenv = require('dotenv')
dotenv.config({ path: __dirname + '/.env' })
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
如果您像我一样正在与多个因素作斗争,那么可能会遇到几个问题。确实,对于纯粹的 Linux 系统管理员来说,从 cron 加载 env 很麻烦,而且可能存在安全风险,即使在容器中也是如此。但是如果您使用 dotenv,问题可能是加载 dotenv 中的绝对路径(crontab 不知道您的 .env 在哪里)、一些基本日志记录(以查看真正的错误是什么)以及最后的 crontab 的组合用户需要安装 pip!
尝试:
envpath = join(dirname('/var/www/node-folder/approot/'), '.env')
* * * * * sudo -H PYTHONPATH=/usr/bin/python3 /usr/bin/python3 /var/www/node-folder/approot/app.py >> /var/log/app.log 2>&1
示例:
from sqlalchemy import create_engine,text
ModuleNotFoundError: No module named 'sqlalchemy'```