使用 djano 框架,后台用 Python 调用 bat 或 shell 脚本,如何实时把调用输出的内容,展示到前端页面中来? - V2EX
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 4548 次点击
    这是一个创建于 2533 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    • 用 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 调用后台接口后刷新页面.
    asd103
        6
    asd103  
       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     Solana     870 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 21:01 PVG 05:01 LAX 14:01 JFK 17:01
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86