V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
css3
V2EX  ›  Python

使用 djano 框架,后台用 Python 调用 bat 或 shell 脚本,如何实时把调用输出的内容,展示到前端页面中来?

  •  
  •   css3 · 2018-11-09 10:42:46 +08:00 · 4074 次点击
    这是一个创建于 2213 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我很菜, 我现在能做的就是:

    • 用 python 把 bat 或 shell 脚本调用时输出的内容全部写一个 txt 里边
    • 然后再读文件,读取了展示到前端 页面中来,

    问题是:

    • 但调用 bat 或 shell 脚本的时间过长,页面一直在处于空闲等待中,
    • 而且效率也太低了,请教下各位大佬,如何将调用脚本的输出,实时输出到页面上?
    • 调用脚本用的 os.system("test.bat"),交互模式下,持续有内容输出的
    第 1 条附言  ·  2018-11-12 14:36:21 +08:00
    非常感谢各位的热心帮忙,因为水平比较菜,我会一 一看一下各位的回复,看哪个我可以实现,就使用哪个😂😂😂
    在此,感谢各位👍
    第 2 条附言  ·  2018-11-12 20:48:38 +08:00

    😭😭😭😭

    各位大佬,非常尴尬的是,我还没有解决我的问题,可能是我之前没说清楚:

    • 我用python运行脚本,最终都会运行结束,脚本不是一个一直存活的进程,而且任务会结束的。是不是不太适用websocket?
    • 当前的问题是,执行脚本是,进程始终会被阻塞住,脚本后面的代码要等脚本执行结束才能开始执行,是不是当务之急是应该是异步处理?
    17 条回复    2018-11-22 09:51:09 +08:00
    chenstack
        1
    chenstack  
       2018-11-09 10:56:34 +08:00
    目测 subprocess.Popen 比较适合
    zk8802
        2
    zk8802  
       2018-11-09 11:04:28 +08:00 via iPhone
    - 后台开个新线程跑 subprocess.Popen(),用异步模式,然后不断把输出写入到一个临时文件中。
    - 前台用 Ajax,或者糙一点儿,用 meta 标签的定时刷新,每隔 N 读出那个临时文件的内容。
    ucun
        3
    ucun  
       2018-11-09 11:19:45 +08:00   ❤️ 1
    用关键字 python webshell 搜,有你想要的
    gimp
        4
    gimp  
       2018-11-09 11:55:36 +08:00
    也许这个能对你有一点点帮助

    https://github.com/sincerefly/online-ping-demo
    Faiz555
        5
    Faiz555  
       2018-11-09 12:00:55 +08:00
    做过类似的,我的解决办法是前端写 JS 调用后台接口后刷新页面.
    tumbzzc
        6
    tumbzzc  
       2018-11-09 12:05:41 +08:00 via Android
    LengthMin
        7
    LengthMin  
       2018-11-09 13:56:01 +08:00 via Android
    之前弄了一个超简单的。。。
    在 csdn 上找到的
    声明一个全局 n
    处理数据的函数每完成一项就把 n 加上某个数

    js 设置定时器,每五秒向另一个 url 请求数据,url 对应的 views 就返回 n 的值
    xpresslink
        8
    xpresslink  
       2018-11-09 14:21:50 +08:00
    有个方案是用 Django 的 Channels (本质上是实现 websocket )实现信息的实时刷新
    但是以你这个水平还是不建议自己搞。
    直接 fork 下面这个开源项目吧
    https://github.com/jumpserver/jumpserver
    xpresslink
        9
    xpresslink  
       2018-11-09 14:23:31 +08:00
    你就把
    配备了业界领先的 Web Terminal 解决方案
    这部分复制了就行了
    changjiangzzZ
        10
    changjiangzzZ  
       2018-11-09 15:33:19 +08:00
    同上,用 channels,本质上是 websocket。django 不断把 bat,shell 脚本输出的内容输送到 channel 里面,浏览器就可以实时读取了
    changjiangzzZ
        11
    changjiangzzZ  
       2018-11-09 15:38:19 +08:00
    目测你遇到的问题是请求被后台长时间运行的进程给 block 了,所以也可以使用异步队列( celery )。然后前端使用 ajax 轮询
    petelin
        12
    petelin  
       2018-11-09 15:43:36 +08:00
    有一个很简单的方法, 用 websocket, js 有可库可以一条命令把一个文件变成 ws 流, 这样就是实现了在前端展示文本变化的功能.
    PureWhiteWu
        13
    PureWhiteWu  
       2018-11-09 15:44:29 +08:00
    没用过 djano,只用过 Django。。。。
    c9106
        14
    c9106  
       2018-11-09 16:30:46 +08:00
    参考下:
    subprocess.Popen(commandline, shell=True, stdout=subprocess.PIPE, cwd=workingPath).stdout.read()
    kazeninaru
        15
    kazeninaru  
       2018-11-09 17:30:14 +08:00
    css3
        16
    css3  
    OP
       2018-11-12 20:49:29 +08:00
    😭😭😭😭😭😭😭😭😭😭
    keven2000
        17
    keven2000  
       2018-11-22 09:51:09 +08:00
    既然用 Django 了,用 Channels 就能很好解决了,h5 端用 ws 监听就可以了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1047 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:32 · PVG 03:32 · LAX 11:32 · JFK 14:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.