【问题标题】:How to Keep my script running in the background如何让我的脚本在后台运行
【发布时间】:2016-10-20 17:05:43
【问题描述】:

我正在制作一个 python 脚本,它从 arduino 发送的串行端口读取数据并将其插入数据库。我正在使用 java 来制作一个图形化数据的 gui。我想在打开 java gui 时让我的 python 脚本在后台运行,但是我想在 java gui 关闭后立即关闭 python 脚本。下面是我的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)

【问题讨论】:

  • 这样运行$ ./script_name.py &
  • 如果你想从 java 运行程序,那么它应该被标记为 java question,而不是 python。
  • 你也可以考虑使用线程。运行 python 脚本的恶魔线程。在这种情况下,你杀死了 gui,你杀死了里面有 python 的线程。
  • @cdarke 这个问题可以在 python 孩子中解决(在 java 代码中进行调整)所以我认为我们应该保留 python 标签。
  • Pd 我正在考虑做一个打开java gui和python脚本的批处理文件,然后当你关闭java gui时,它也会关闭python进程

标签: python python-3.x arduino background-process


【解决方案1】:

确定父进程是否已退出的一种跨平台方法是打开进程之间的管道并等待其关闭。以下示例在子进程中启动一个线程,等待 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2016-11-12
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2022-12-22
    • 2012-05-03
    相关资源
    最近更新 更多