我有一个在Azure App Service上运行的Python(Django)Web应用程序.

尽管我从其他so线程try 了各种方法,但我不知道如何从我的Cron和Cron任务访问环境变量.这可能是因为Azure将venv复制成了奇怪的antenv.稍后将详细介绍这一点.

really想要的是在Cron和Cron中使用django命令,比如./manage.py some_command.然而,我很快意识到在Cron和Cron中没有正确加载Django虚拟环境.因此,我决定一步一步地了解如何从Cron和Cron访问虚拟环境.

What I have tried

初步实施

我正在使用Azure应用程序服务SSH控制台测试我的设置,该控制台在https://{my-app-name}.scm.azurewebsites.net/webssh/host提供.

脚本

我创建了一个脚本/home/scripts/log-env.sh来测试水:

#!/bin/bash
trace=/home/scripts/trace
path=$(...) # Some command that locates the venv directory
echo "src path: ${path}" > ${trace}  # I can see ${path} is set correctly
echo "MY_VAR before source: [${MY_VAR}]" >> ${trace}
source ${path}/antenv/bin/activate; echo "MY_VAR same command line as source: [${MY_VAR}]" >> ${trace}
echo "MY_VAR after source: [${MY_VAR}]" >> ${trace}

输出

当我在终端中运行脚本时,它显示我甚至不需要为venv提供源代码,因为在调用source之前可以访问$MY_VAR:

# Content of trace file /home/scripts/trace when script runs in the terminal
src path: /tmp/8dbe5c185e85419
$MY_VAR before source: [expected_value]
$MY_VAR same command line as source: [expected_value]
$MY_VAR after source: [expected_value]

但当它从Cron和Cron运行时,无论是在venv被激活之前还是在venv被激活之后,都无法访问$MY_VAR:

# Content of trace file /home/scripts/trace when script runs in Cron和Cron
src path: /tmp/8dbe5c185e85419
$MY_VAR before source: []  # empty
$MY_VAR same command line as source: []  # empty
$MY_VAR after source: []  # empty

Cron和Cron

我在Cron和Crontab中添加了以下条目:

> Cron和Crontab -l
* * * * * bash /home/scripts/log-env.sh > /home/scripts/Cron和Cron.log 2>&1

其他try

我try 了以下更改that solved other questions on SO,但在我的情况下不起作用:

Add SHELL=/bin/bash on top of the Cron和Crontab:

> Cron和Crontab -l
SHELL=/bin/bash
* * * * * bash /home/scripts/log-env.sh > /home/scripts/Cron和Cron.log 2>&1

Source in Cron和Cron

> Cron和Crontab -l
* * * * * cd /tmp/8dbe5c185e85419 && source /tmp/8dbe5c185e85419/antenv/bin/activate && /home/scripts/log-env.sh > /home/scripts/Cron和Cron.log 2>&1

Azure antenv/ vs usual venv/

由于某些原因,Azure服务器有一个antenv/目录:

(antenv) root@23e4a05be277:/tmp/8dbe5c185e85419# ls -l *env
antenv:
total 16
drwxr-xr-x 2 root root 4096 Nov 15 16:30 bin
drwxr-xr-x 3 root root 4096 Nov 15 16:30 include
drwxr-xr-x 3 root root 4096 Nov 15 16:30 lib
-rw-r--r-- 1 root root  287 Nov 15 16:30 pyvenv.cfg

venv:
total 20
drwxr-xr-x 2 root root 4096 Nov 15 16:30 bin
drwxr-xr-x 3 root root 4096 Nov 15 16:30 include
drwxr-xr-x 3 root root 4096 Nov 15 16:30 lib
drwxr-xr-x 3 root root 4096 Nov 15 16:30 lib64
-rwxr-xr-x 1 root root  282 Nov 15 16:30 pyvenv.cfg

这是默认设置的环境.它在连接到SSH时处于活动状态,如提示符(antenv)前缀所示:

(antenv) root@23e4a05be277:/tmp/8dbe5c185e85419

pyvenv.cfg个文件如下所示:

root@23e4a05be277:/tmp/8dbe5c185e85419# cat *env/*.cfg
# antenv/pyvenv.cfg
home = /tmp/oryx/platforms/python/3.11.6/bin
include-system-site-packages = true
version = 3.11.6
executable = /tmp/oryx/platforms/python/3.11.6/bin/python3.11
command = /tmp/oryx/platforms/python/3.11.6/bin/python3.11 -m venv --copies --system-site-packages /tmp/8dbe5c185e85419/antenv

# venv/pyvenv.cfg
home = /opt/hostedtoolcache/Python/3.11.6/x64/bin
include-system-site-packages = false
version = 3.11.6
executable = /opt/hostedtoolcache/Python/3.11.6/x64/bin/python3.11
command = /opt/hostedtoolcache/Python/3.11.6/x64/bin/python -m venv /home/runner/work/jobalerts/jobalerts/venv

我try 了antenvvenv的各种变化.没有一个奏效.

不用说,我在这里远远超出了我的能力范围.我们欢迎任何人帮忙解决这一烂摊子.

推荐答案

正如我在一条 comments 中所写的,就目前而言,我发现的最不可怕的解决方法是这个:https://learn.microsoft.com/en-us/answers/questions/719903/how-to-set-my-django-apps-management-commands-as-c

不过,我并不是一个使用睡眠的超级粉丝.由于调度是我的产品的一个关键部分,我将寻找Azure的替代方案,看看是否可以在那里使用cron.

Django相关问答推荐

如何根据属性的 Select 对查询集进行排序

Django Admin中显示的DateField下面的小提示是什么?

我无法在Django模板中使用Get_Foo_Display

Django为不同应用程序发出信号

在Python中向函数的查询列表添加条件

没有与给定查询匹配的监视列表

通过get_form_kwargs将请求传递给Django表单未能使表单访问self.request.user.

如果字段为空,则 Unique_together 不起作用.怎么约束呢?

使用 Crispy Forms 时 Django 返回 'TemplateDoesNotExist'

在 Django Admin change_list 视图中更改 list_editable 字段时保存 Django 模型

带有代码完成功能的 python / django 的 Sublime Text 2 和 3 设置

如何使用 matplotlib 在绘图的角落插入小图像?

Django JSONField 过滤

Django:显示在每个页面上加载页面所花费的时间

有 Django List View 模型排序吗?

使用 Django 1.5 实现多种用户类型

如何在保存之前更改 Django 表单字段值?

Django/Python初学者:执行python manage.py syncdb时出错-找不到psycopg2

Django - 指定 Django 管理员应该使用哪个模型管理器

如何更改 django 模板中布尔值的打印方式?