我有一个小的网络面板,我想在其中控制一个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/