python异步执行外部多个py文件_python网页.py异步执行外部程序

我有一个网页.py应用程序运行在内置的cherrypy服务器上。

我想在用户发布到url时执行一个外部脚本,该脚本将在python的后台运行子流程.Popen打电话和网页.py将重定向到使用jqueryajax请求监视脚本进度的另一个页面。

但我不能在这里正确地执行这个。

代码片段如下,如果需要,我可以提供更多信息。在import web

from multiprocessing import Process

import subprocess, shlex

import time, json

from login import authorize, sessidGen

def __callProcess(processString,mod='w',shell=False):

if not shell: args = shlex.split(processString)

else: args = processString

out = open('./bteq/logs/output.log',mod)

err = open('./bteq/logs/error.log',mod)

p = subprocess.Popen(args,stdout=out,stderr=err,shell=shell)

return p

def setExec():

__callProcess("chmod +x ./bteq/*.sh",shell=True)

def bteqExec(filename,system):

if system not in ['prod','da','cdw','cdw2','cert','']: return False

processString = " ".join([filename,system])

p = __callProcess(processString)

return p.pid

render = web.template.render('templates/',base='layout')

render_plain = web.template.render('templates/')

class Executor:

def GET(self):

authorize()

session = web.ctx.session

inputs = web.input(sessid={},type={})

if not inputs.sessid or session.id != inputs.sessid: web.seeother('/')

if inputs.sessid and inputs.type:

return render.executor('BTEQ Executor',inputs.type,inputs.sessid)

else: raise web.seeother('/')

def POST(self):

authorize()

session = web.ctx.session

inputs = web.input(sessid={},type={},act={})

if not inputs.sessid or session.id != inputs.sessid: web.seeother('/')

if inputs and inputs.act == 'start':

pid = bteqExec('python ./bteq/timer.py','')

session.id = sessidGen()

session.exctrpid = pid

return web.seeother('/progress.htm')

else: raise web.seeother('/')

class progress:

def GET(self):

authorize()

session = web.ctx.session

inputs = web.input(ajax={})

if inputs.ajax == 'true':

web.header('Content-Type', 'application/json')

if session.count >= 100: session.count = 0

session.count += 10

pid = session.exctrpid

out = open('./bteq/logs/output.log','r')

err = open('./bteq/logs/error.log','r')

output = ('OUTPUT:
'+out.read()).replace('\n','
')

err = err.read()

if err:error = ('ERRORS:
'+err.read()).replace('\n','
')

else: error = None

d = {'count':session.count,'msg':output,'err':error,'rc':pid,'session_id':session.session_id}

return json.dumps(d)

r = web.template.Template('$def with (title)\n$var title: $title\n')

return render_plain.layout_pgbar(r('progress test'))

因为子流程.Popen对象不可pickle它不能作为会话变量放入,我想把p.poll()和p。标准读()来自进步班。在

另外,我希望代码在linux和windows中都可以运行,我在windows中设置了dev并将其部署在linux服务器上。在

有人能帮我吗。。。在

谢谢。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值