当前位置: 代码网 > it编程>前端脚本>Python > Django调用外部Python程序的完整项目实战

Django调用外部Python程序的完整项目实战

2025年12月13日 Python 我要评论
一、为什么 django 需要调用外部 python 程序django 是 web 框架,但它经常需要与外部脚本互动,例如:启动某个独立运行的监控脚本执行训练模型、特征提取脚本启动 cpu / 内存压

一、为什么 django 需要调用外部 python 程序

django 是 web 框架,但它经常需要与外部脚本互动,例如:

  • 启动某个独立运行的监控脚本
  • 执行训练模型、特征提取脚本
  • 启动 cpu / 内存压力脚本
  • 调用分析脚本并返回结果
  • 运行系统层面的 python 工具

你的 aiops 场景就是典型需求:
点击前端按钮 → 启动 cpu 压力脚本 → 持续采集数据

二、三种常见的调用方式

方式 1:直接 import 调用(轻量级)

写一个外部脚本:

# scripts/calc.py
def calc():
    return 1 + 1

django 中调用:

from scripts.calc import calc

def index(request):
    result = calc()
    return httpresponse(result)

这种方式最简单,但缺点也明显:

不能用于启动长期运行的脚本(比如你的压力脚本),因为会阻塞 django。

方式 2:subprocess 启动外部进程(最常用)

适用于:

  • cpu 压力脚本
  • 特征提取脚本
  • 数据处理脚本
  • 长时间运行程序

示例:

import subprocess

def run_script():
    subprocess.popen(["python", "scripts/load_cpu.py"])

它会启动一个完全独立的 python 进程,不会阻塞 django。

方式 3:django 异步任务(高级版)

使用 celery、django-q、huey 等任务队列:

  • 任务会进入队列,不阻塞网页
  • 可以查看任务运行状态
  • 可以重试、监控

大型公司一般采用这种方式。但对入门来说略复杂。

三、完整项目实战:用 django 按钮启动 cpu 负载脚本

假设你想用 django 前端按钮启动下面这个脚本负载 cpu:

# scripts/cpu_stress.py
import time

def stress():
    while true:
        x = 0
        for i in range(10_000_000):
            x += i  # 消耗 cpu
        time.sleep(0.1)

不要让 django import 运行,而是让它跑在独立进程:

step 1:将脚本放入项目目录

project/
  scripts/
      cpu_stress.py
  app/
      views.py

step 2:创建启动脚本的 view

# app/views.py
import subprocess
from django.http import jsonresponse
import os, sys

process = none

def start_stress(request):
    global process
    if process and process.poll() is none:
        return jsonresponse({"msg": "已在运行中"})

    script = os.path.join(os.getcwd(), "scripts", "cpu_stress.py")
    process = subprocess.popen([sys.executable, script])

    return jsonresponse({"msg": "启动成功"})


def stop_stress(request):
    global process
    if process:
        process.terminate()
        process = none
        return jsonresponse({"msg": "已停止"})
    return jsonresponse({"msg": "没有正在运行的任务"})

step 3:前端按钮示例

<button onclick="fetch('/start_stress').then(r=>r.json()).then(alert)">启动负载</button>
<button onclick="fetch('/stop_stress').then(r=>r.json()).then(alert)">停止负载</button>

前端只需发起请求,django 随即启动或终止压力脚本。

四、常见错误示例与调试技巧

错误 1:使用 import 直接运行死循环

错误写法:

from scripts.cpu_stress import stress

def start(request):
    stress()  # ❌ 会把 django 线程卡死

原因:

压力脚本死循环 → django 视图无法返回 → 网站挂掉。

错误 2:subprocess 没写绝对路径

错误写法:

subprocess.popen(["python", "cpu_stress.py"])  # ❌ 找不到脚本

正确写法:

script = os.path.join(os.getcwd(), "scripts", "cpu_stress.py")
subprocess.popen([sys.executable, script])

错误 3:windows 进程无法 terminate

在 windows 上,某些子进程会继续挂着,可以改为:

process.kill()

调试技巧:查看子进程是否启动

linux / wsl:

ps aux | grep cpu_stress

windows:

tasklist | findstr python

这类调试技巧在 aiops 项目中非常常用。

五、生产环境高级技巧

1. 使用日志记录子进程输出

subprocess.popen(
    [sys.executable, script],
    stdout=open("out.log", "w"),
    stderr=open("err.log", "w")
)

方便你排查模型脚本/压力脚本的问题。

2. 给脚本加锁,避免重复启动

if process and process.poll() is none:
    # 已经在运行中

防止用户疯狂点击按钮导致重复启动多个压力脚本。

3. 使用 redis / 数据库存储子进程 pid

生产环境推荐:

  • django view 启动脚本
  • 保存 pid 到 redis
  • 前端通过 pid 判断脚本是否在运行

4. 避免 sqlite 作为生产数据库

你的前端压力脚本会导致 sqlite 锁表问题。
生产中建议使用:

  • postgresql(最常用)
  • mysql / mariadb

sqlite 不适合频繁写入+多进程并发。

六、背后原理与机制拓展

django 本身不能跑长任务

django 是典型的:

  • 同步请求 → 同步响应
  • 一个请求不能占用长时间

所以它天生不适合:

  • 死循环脚本
  • 深度学习训练任务
  • cpu 压力测试脚本
  • 视频特征提取任务

这类任务应该由:

  • subprocess
  • celery
  • 后台 worker

来完成。

为什么 subprocess 是最常用方案?

因为:

  • 独立进程,不影响 django 主进程
  • 可以 kill / terminate
  • 支持长时间运行
  • 支持日志
  • 支持参数传递
  • windows / linux 都能跑

它是 aiops 平台后台运行脚本的最基础工具。

总结

文章介绍了 django 调用外部 python 脚本的三种方法,并通过完整的项目案例展示如何用 django 前端按钮启动与停止 cpu 压力脚本,同时补充了常见错误、调试技巧、高级实践和背后原理。

到此这篇关于django调用外部python程序的文章就介绍到这了,更多相关django调用外部python程序内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com