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

标签 javascript jquery python ajax

我有一个小的网络面板,我想在其中控制一个Python脚本,该脚本不断地从传感器收集数据(while循环)。我希望只需单击一个按钮即可启动和停止该脚本。我知道一种让脚本停止的方法,但是启动它似乎有点麻烦。

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

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

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

最佳答案

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

按钮: 这里我们只有 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()

希望我能帮助别人解决这个问题:)

关于javascript - 通过网站启动 Python 脚本(单击按钮),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31764650/

相关文章:

javascript - 禁用选中的字段

javascript - 使用 json.js 字符串化多维数组的问题

jquery - Bootstrap 2.3.2 与 jQuery 1.9 兼容吗?

python - 根据保存的 tensorflow 变量进行预测

javascript - 空元素被添加到对象中

javascript - 我的表单正在同一网址上发出 get 请求,我不知道为什么要这样做

jquery - 隐藏内容扭曲了 css 多列布局上的列

python - 在 Python 中读入索引彩色图像

python - 有人成功采用了 JaikuEngine 吗?

javascript - 在设置了 MaxLength 的文本字段中查找粘贴文本的长度