通过网站启动Python脚本(单击按钮)

时间:2015-08-01 18:03:56

标签: javascript jquery python ajax

我有一个小网页面板,我想控制一个python脚本,不断从传感器收集数据(while循环)。我希望能够通过简单地单击按钮来启动和停止此脚本。我知道一种启用脚本停止的方法,但启动它似乎有点麻烦。

我尝试了几个包含jQuery.ajax请求的解决方案,但遗憾的是没有启动脚本。应该注意的是,我只想启动脚本,我不希望它有任何输出/返回值,因此脚本需要在后台异步运行(毕竟这是Ajax的用途)。

以下是一些可能有效的解决方案: 1)安装烧瓶。事情是我实际上真的想避免这种情况,而是找到一种直接的方法来做到这一点。毕竟,我只想对脚本发出请求以便执行。 2)通过在服务器上安装PHP并使用exec()来执行它。但这又回到了我实际上更喜欢直接使用Python或通过实际工作的jQuery / Ajax调用来实现的目的。

有关如何设置的任何建议?如果没有其他办法,我认为安装PHP并使用它来执行文件是唯一的方法。如果这是真的,那么实际上是否可以通过PHP exec()调用异步运行两个Python脚本?

1 个答案:

答案 0 :(得分:2)

只是想回答我自己的问题,经过广泛的研究,我找到了解决我最初问题的方法。这是一个描述:

按钮: 在这里,我们只为我们的Javascript函数提供了onclick事件。

<div class="col-md-4"><button id="script_run" type="button" class="btn btn-primary" onclick="runscript()">Test</button></div>

Javascript代码: 在Javascript方面,我创建了2个函数。一个用于更新按钮颜色的用户(因此用户将知道脚本当前是否正在运行)和一个实际通过Ajax向我们的Python脚本发出HTTP请求的脚本。你会注意到的是,对于按钮,我们正在检查是否存在本地文件(RUNNING.txt)。这是因为RUNNING.txt是在执行我们的Python脚本时创建的临时文件,这里我们存储我们同时运行的进程的ID,以便我们以后可以终止它们。

function changebutton() {
    $.ajax({
        url: "RUNNING.txt",
        error: function() {
            document.getElementById('script_run').className = "btn btn-danger";
            document.getElementById('script_run').innerHTML = "OFFLINE";
        },
        success: function() {
            document.getElementById('script_run').className = "btn btn-success";
            document.getElementById('script_run').innerHTML = "ONLINE";
        }
    });
}
changebutton();

function runscript() {
    if (document.getElementById('script_run').innerHTML == "ONLINE") {
        $.ajax({
            type: "POST",
            url: 'main.py',
            data: {offline: "True"}
        })
        .done(setTimeout(function(){
            changebutton();
        }, 50000));
    }
    else {
        $.ajax({
            url: 'main.py'
        })
        .done(setTimeout(function(){
            changebutton();
        }, 50000));
    }
};

Python代码: 我们在这里做的是,当调用脚本时,我们正在创建文件RUNNING.txt。然后我们实际进入核心部分:这是我们函数的异步处理。这是通过多处理库实现的。之后,我们将进程ID保存在RUNNING.txt中并等待事件。如果再次调用脚本(这会引导我们进入else语句),我们执行abort()函数,它只使用os.kill()函数来终止我们的进程。就是这样:))

import multiprocessing
import cgi
import os
import os.path
import signal

import YOURFUNCTION1
import YOURFUNCTION2

def abort():
    f = open('RUNNING.txt', 'r')
    process = f.readline()
    process = filter(None, process.split(","))

    for p in process:
        os.kill(int(p), signal.SIGQUIT)

    f.close()
    os.remove('RUNNING.txt')

def main():
    if not os.path.isfile("RUNNING.txt"):
        f = open('RUNNING.txt', 'w+')

        for func in [YOURFUNCTION1, YOURFUNCTION2]:
            processes.append(multiprocessing.Process(target=func))
            processes[-1].start()

        for p in processes:
            f.write(str(p.pid))
            f.write(",")
        f.close()

        choice = raw_input("Press X to abort all processes: ")
        if choice == "X":
            abort()
    else:
        print "Processes already operational."
        if form.getvalue('offline') == "True":
            abort()

希望我可以帮助这个人:)