我有一个小网页面板,我想控制一个python脚本,不断从传感器收集数据(while循环)。我希望能够通过简单地单击按钮来启动和停止此脚本。我知道一种启用脚本停止的方法,但启动它似乎有点麻烦。
我尝试了几个包含jQuery.ajax请求的解决方案,但遗憾的是没有启动脚本。应该注意的是,我只想启动脚本,我不希望它有任何输出/返回值,因此脚本需要在后台异步运行(毕竟这是Ajax的用途)。
以下是一些可能有效的解决方案: 1)安装烧瓶。事情是我实际上真的想避免这种情况,而是找到一种直接的方法来做到这一点。毕竟,我只想对脚本发出请求以便执行。 2)通过在服务器上安装PHP并使用exec()来执行它。但这又回到了我实际上更喜欢直接使用Python或通过实际工作的jQuery / Ajax调用来实现的目的。
有关如何设置的任何建议?如果没有其他办法,我认为安装PHP并使用它来执行文件是唯一的方法。如果这是真的,那么实际上是否可以通过PHP exec()调用异步运行两个Python脚本?
答案 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()
希望我可以帮助这个人:)