运行shell脚本的Django命令

2024-04-19 05:37:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个应用程序可以删除一个多月前上传的文件

from django.core.management.base import BaseCommand, CommandError
from blacklist_app.models import EntradaHistorial
from datetime import datetime, timedelta
import pytz, subprocess, os
from blacklist.settings import BASE_DIR

class Command(BaseCommand):
    help = "Procesa archivos en cola para ser movidos al servidor de destino acorde a la configuración"
    tmp   = os.path.join(BASE_DIR, 'blacklist_app/tmp')
    excel = os.path.join(BASE_DIR, 'blacklist_app/uploaded_files/excel')
    json  = os.path.join(BASE_DIR, 'blacklist_app/uploaded_files/json')
    mv = 'mv {}/{} {}'
    rm = 'rm {}/{}'

    def handle(self, *args, **options):
        max_date = datetime.now() + timedelta(weeks=-1)
        preg = "*_{}*".format(max_date.strftime('%Y%m'))
        #Se mueven los archivos que deben ser conservados a la carpeta temporal
        self.mv_and_rm(self.excel, preg)
        self.mv_and_rm(self.json, preg)
        max_date.replace(day=1, hour=0, minute=0, tzinfo=pytz.UTC)
        #Actualiza los valores de los archivos borrados
        EntradaHistorial.objects.filter(fecha__lt=max_date, archivo_borrado=False).update(archivo_borrado=True)

    # Mueve los archivos a la carpeta temporal, borra los archivos que deben ser borrados y 
    # mueve de vuelta los archivos que deben ser conservados
    def mv_and_rm(self, dir, preg):
        move = self.mv.format(dir, preg, self.tmp)
        self.run_command(move)
        rm  = self.rm.format(dir, '*')
        self.run_command(rm)
        move_back = self.mv.format(self.tmp, preg, dir)
        self.run_command(move_back)

    def run_command(self, command):
        sh = os.path.join(BASE_DIR,'blacklist_app/management/commands/run_command.sh')
        call = "sh {} '{}'".format(sh, command)
        print(subprocess.check_output(call))

在同一目录中,我让脚本运行_command.sh

#!/bin/sh

$1

这个命令应该在每个月的第一天在crontab中运行,这就是我从当前日期减去一周的原因。现在我正在测试它,手动运行它

我得到的错误是

FileNotFoundError: [Errno 2] No such file or directory: 
"/code/blacklist_app/management/commands/run_command.sh 'mv 
/code/blacklist_app/uploaded_files/excel/*_202003* /code/blacklist_app/tmp'"