【问题标题】:run code if subprocess ends processing如果子进程结束处理,则运行代码
【发布时间】:2017-08-10 09:58:54
【问题描述】:

在我的 django 视图中,我需要在子进程完成后发送电子邮件通知,因为子进程启动的脚本正在后台运行一些命令,所以在脚本完成之前发送电子邮件,有没有人知道我怎么能这样做?

我的看法:

def getor(request):
# process
    subprocess.call("./step1.sh", shell=True)
#send notification
    current_site = get_current_site(request)
    user = User.objects.values('username').order_by('id').last()
    us = user['username']
    subject = 'Notification of endprocess.'
    message = render_to_string('notify.html', {
       'us':us,
       'domain':current_site.domain,
    })
    eml = User.objects.values('email').order_by('id').last()
    toemail = eml['email']
    email = EmailMessage(subject, message, to=[toemail])
    email.send()
    return render(request, 'endexecut.html')

【问题讨论】:

标签: python django subprocess


【解决方案1】:

快速修复可以将电子邮件发送到一个函数中并创建一个 python 文件。从step1.sh 拨打电话

我无法理解的是,subprocess.call 是一个阻塞函数。即在调用函数中的命令没有完成之前,它不会转到下一行代码。

我会选择 gevent。把所有的函数都是gevent spawn。在函数内部首先调用子进程并存储PID。下一个代码应该是一个while循环并检查PID是否存在。如果不是发送邮件并打破循环。或者睡几秒钟。

【讨论】:

  • 感谢您的回答,我只是将电子邮件代码放入 python 脚本并导入 django 设置,以便我可以使用电子邮件设置并从子进程中的 bash 脚本调用此 python 脚本。 subprocess.call() 在这种情况下不会阻塞,因为脚本中的命令是在后台运行的。
  • 很高兴听到。如果我的回答有帮助,请考虑将其标记为我们双方的业力。
猜你喜欢
  • 1970-01-01
  • 2021-05-18
  • 2018-02-12
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多