我有一个小的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()
希望我能帮到一些人。