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

2025-12-13 19:50

本文主要是介绍Django调用外部Python程序的完整项目实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Django调用外部Python程序的完整项目实战》Django是一个强大的PythonWeb框架,它的设计理念简洁优雅,:本文主要介绍Django调用外部Python程序的完整项目实战,文中通...

一、为什么 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 js按钮启动 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({www.chinasem.cn"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, scriptjs],
    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 锁表问题。
生产中建议使用:

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

六、背后原理与机制拓展

Django 本身不能跑长任务

Django 是典型的:

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

所以它天生不适合:

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

这类任务应该由:

  • subprocess
  • Celery
  • 后台 Worker

来完成。

为什么 subprocess 是最常用方案?

因为:

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

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

总结

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

到此这篇关于Django调用外部Python程序的文章就介绍到这了,更多相关Django调用外部Python程序内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Django调用外部Python程序的完整项目实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156442

相关文章

基于Python编写一个git自动上传的脚本(打包成exe)

《基于Python编写一个git自动上传的脚本(打包成exe)》这篇文章主要为大家详细介绍了如何基于Python编写一个git自动上传的脚本并打包成exe,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录前言效果如下源码实现利用pyinstaller打包成exe利用ResourceHacker修改e

Python在二进制文件中进行数据搜索的实战指南

《Python在二进制文件中进行数据搜索的实战指南》在二进制文件中搜索特定数据是编程中常见的任务,尤其在日志分析、程序调试和二进制数据处理中尤为重要,下面我们就来看看如何使用Python实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

Python中Tkinter GUI编程详细教程

《Python中TkinterGUI编程详细教程》Tkinter作为Python编程语言中构建GUI的一个重要组件,其教程对于任何希望将Python应用到实际编程中的开发者来说都是宝贵的资源,这篇文... 目录前言1. Tkinter 简介2. 第一个 Tkinter 程序3. 窗口和基础组件3.1 创建窗

Python字符串处理方法超全攻略

《Python字符串处理方法超全攻略》字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,:本文主要介绍Python字符串处理方法的相关资料,文中通过代码介... 目录一、基础知识:字符串的“不可变”特性与创建方式二、常用操作:80%场景的“万能工具箱”三、格式化方法

浅析python如何去掉字符串中最后一个字符

《浅析python如何去掉字符串中最后一个字符》在Python中,字符串是不可变对象,因此无法直接修改原字符串,但可以通过生成新字符串的方式去掉最后一个字符,本文整理了三种高效方法,希望对大家有所帮助... 目录方法1:切片操作(最推荐)方法2:长度计算索引方法3:拼接剩余字符(不推荐,仅作演示)关键注意事

python版本切换工具pyenv的安装及用法

《python版本切换工具pyenv的安装及用法》Pyenv是管理Python版本的最佳工具之一,特别适合开发者和需要切换多个Python版本的用户,:本文主要介绍python版本切换工具pyen... 目录Pyenv 是什么?安装 Pyenv(MACOS)使用 Homebrew:配置 shell(zsh

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1

Python自动化提取多个Word文档的文本

《Python自动化提取多个Word文档的文本》在日常工作和学习中,我们经常需要处理大量的Word文档,本文将深入探讨如何利用Python批量提取Word文档中的文本内容,帮助你解放生产力,感兴趣的小... 目录为什么需要批量提取Word文档文本批量提取Word文本的核心技术与工具安装 Spire.Doc

Java调用DeepSeek API的8个高频坑与解决方法

《Java调用DeepSeekAPI的8个高频坑与解决方法》现在大模型开发特别火,DeepSeek因为中文理解好、反应快、还便宜,不少Java开发者都用它,本文整理了最常踩的8个坑,希望对... 目录引言一、坑 1:Token 过期未处理,鉴权异常引发服务中断问题本质典型错误代码解决方案:实现 Token

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.