通过网站初始化Python脚本(点击按钮)



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

我尝试了包括jQuery在内的几个解决方案。Ajax请求,但遗憾的是没有启动脚本。应该注意的是,我只想启动脚本,我不想从它得到任何输出/返回值,所以脚本需要在后台异步运行(这就是Ajax的作用)。

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

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

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

按钮:这里我们只有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请求。您将注意到,对于按钮,我们正在检查本地文件(run .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。然后我们进入核心部分:函数的异步处理。这是通过multiprocessing库实现的。之后,我们将进程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()

希望我能帮到一些人。

最新更新