django 在子进程中运行python脚本

4dc9hkyq  于 2023-03-04  发布在  Go
关注(0)|答案(1)|浏览(159)

我有一个计划为cronjob的celery 任务,但如果失败,我将运行一个备份脚本,该脚本将命令选项中的任务作为子进程运行。

1) Activate python virtual environment in right directory
2) Use django manage.py to acess python shell
3) import and run the task

我创建了如下代码

process = subprocess.Popen(["source", "/application/bin/activate", "&&", "python3","/application/src/manage.py", "shell"],stdin=subprocess.PIPE,stdout=subprocess.PIPE)
 output1, error1 = process.communicate(b"from app.tasks import prediction")
 output2, error2 = process.communicate(b"prediction.run_task()")

这会导致django import not found错误,这是由于没有激活python venv而引起的
在终端中运行时,这些命令都能正常工作
有没有更好的方法来做到这一点,或者我如何解决这个问题?

ru9i0ody

ru9i0ody1#

您可以使用source命令激活虚拟环境,然后使用python命令激活以运行manage.py脚本,并使用必要的参数访问Python shell和运行任务,而不是使用subprocess激活虚拟环境和运行Celery任务。您可以使用subprocess模块在备份脚本中运行此命令:

import subprocess
command = 'source /application/bin/activate && python /application/src/manage.py shell -c \'from app.tasks import prediction; prediction.run_task()\''
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = process.communicate()

这将激活虚拟环境并成功运行Celery任务

相关问题