如何在后台保留我的脚本 运行
How to Keep my script running in the background
我正在制作一个 python 脚本,它从 arduino 发送的串行端口读取数据并将其插入数据库。我正在使用 java 制作一个图形化数据图形用户界面。当 java gui 打开时,我想在后台保留我的 python 脚本 运行,但我想在 [=14= 后立即关闭 python 脚本] gui 关闭。下面是我的 python 代码,我还没有实现 java gui。
import serial, sqlite3
conn=sqlite3.connect("ProyectoFinal1.db")
c=conn.cursor()
ser = serial.Serial('COM5', 9600)
def tableCreate():
c.execute("CREATE TABLE Temperatura(ID INT,valor INT,Fecha TIMESTAMP)")
c.execute("CREATE TABLE Humedad(ID INT,valor INT,Fecha TIMESTAMP)")
def dataEntry(tabla,valor):
c.execute("INSERT INTO %(tabla)s (Fecha,valor) VALUES(CURRENT_TIMESTAMP,%(valor)s)"%{"tabla":tabla,"valor":valor})
conn.commit()
def serialRead():
ser = serial.Serial("/dev/ttyUSB0")
for data in ser.readline():
if data:
serial=data
return serial
def parse(toParse):
toParse=toParse.split(" ")
humidity=toParse[0]
temperature=toParse[1]
toParse=[humidity,temperature]
return toParse
while True:
temperatura=parse(ser.readline())[1]
humedad=parse(ser.readline())[0]
dataEntry("Temperatura",temperatura)
dataEntry("Humedad",humedad)
print (humedad)
print (temperatura)
确定父进程是否退出的一种跨平台方法是打开进程之间的管道并等待它关闭。下面的示例在子进程中启动一个线程,等待 stdin 关闭,然后关闭串行端口,然后退出主循环的 readline。
为此,父 java 脚本需要打开一个管道并将其用于 python 进程 stdin
。我不知道该怎么做,但由于您没有显示 java 代码,我会假装这就是我没有包含它的原因。这还有一个额外的好处,因为父 java 代码可以通过简单地通过管道发送一个 "\n"
来优雅地关闭子代码。
import threading
import sys
# add everything before your while loop here
def parent_exit_detector(ser_to_close, pipe_to_wait):
"""Wait for any data or close on pipe and then close the
serial port"""
try:
pipe_to_wait.read(1)
finally:
ser.close()
_exit_detector_thread = threading.Thread(target=parent_exit_detector,
args=(ser, sys.stdin))
_exit_detector_thread.isDaemon = True
# add the while loop here
我正在制作一个 python 脚本,它从 arduino 发送的串行端口读取数据并将其插入数据库。我正在使用 java 制作一个图形化数据图形用户界面。当 java gui 打开时,我想在后台保留我的 python 脚本 运行,但我想在 [=14= 后立即关闭 python 脚本] gui 关闭。下面是我的 python 代码,我还没有实现 java gui。
import serial, sqlite3
conn=sqlite3.connect("ProyectoFinal1.db")
c=conn.cursor()
ser = serial.Serial('COM5', 9600)
def tableCreate():
c.execute("CREATE TABLE Temperatura(ID INT,valor INT,Fecha TIMESTAMP)")
c.execute("CREATE TABLE Humedad(ID INT,valor INT,Fecha TIMESTAMP)")
def dataEntry(tabla,valor):
c.execute("INSERT INTO %(tabla)s (Fecha,valor) VALUES(CURRENT_TIMESTAMP,%(valor)s)"%{"tabla":tabla,"valor":valor})
conn.commit()
def serialRead():
ser = serial.Serial("/dev/ttyUSB0")
for data in ser.readline():
if data:
serial=data
return serial
def parse(toParse):
toParse=toParse.split(" ")
humidity=toParse[0]
temperature=toParse[1]
toParse=[humidity,temperature]
return toParse
while True:
temperatura=parse(ser.readline())[1]
humedad=parse(ser.readline())[0]
dataEntry("Temperatura",temperatura)
dataEntry("Humedad",humedad)
print (humedad)
print (temperatura)
确定父进程是否退出的一种跨平台方法是打开进程之间的管道并等待它关闭。下面的示例在子进程中启动一个线程,等待 stdin 关闭,然后关闭串行端口,然后退出主循环的 readline。
为此,父 java 脚本需要打开一个管道并将其用于 python 进程 stdin
。我不知道该怎么做,但由于您没有显示 java 代码,我会假装这就是我没有包含它的原因。这还有一个额外的好处,因为父 java 代码可以通过简单地通过管道发送一个 "\n"
来优雅地关闭子代码。
import threading
import sys
# add everything before your while loop here
def parent_exit_detector(ser_to_close, pipe_to_wait):
"""Wait for any data or close on pipe and then close the
serial port"""
try:
pipe_to_wait.read(1)
finally:
ser.close()
_exit_detector_thread = threading.Thread(target=parent_exit_detector,
args=(ser, sys.stdin))
_exit_detector_thread.isDaemon = True
# add the while loop here