Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python脚本作为守护进程运行失败(读取一行时为EOFError:EOF)_Python_Python 3.x_Macos_Launchd - Fatal编程技术网

python脚本作为守护进程运行失败(读取一行时为EOFError:EOF)

python脚本作为守护进程运行失败(读取一行时为EOFError:EOF),python,python-3.x,macos,launchd,Python,Python 3.x,Macos,Launchd,我已经创建了一个python3脚本,它可以在命令行上正常运行,但是当我尝试在MacosX中作为守护进程运行时,会出现错误“eoferor:EOF when reading a line”。基本代码如下: (...) def main(): # Connect port, speed = connect_port() device = XBeeDevice(port, speed) try: device.open() # p

我已经创建了一个python3脚本,它可以在命令行上正常运行,但是当我尝试在MacosX中作为守护进程运行时,会出现错误“eoferor:EOF when reading a line”。基本代码如下:

  (...)

  def main():

    # Connect
    port, speed = connect_port()

    device = XBeeDevice(port, speed)

    try:
      device.open()
      # print("Waiting for data...\n")

     (...)

      device.add_packet_received_callback(packet_received_callback)
      input()

    finally:
      if device is not None and device.is_open():
        device.close()

  if __name__ == '__main__':
    main()
plist似乎很好,因为脚本在开始之前运行一次,以给出错误:

Traceback (most recent call last):
File "/maslestorres.cat/jardiNet_datalogger.py", line 214, in <module>
main()
File "/maslestorres.cat/jardiNet_datalogger.py", line 206, in main
input()
EOFError: EOF when reading a line
回溯(最近一次呼叫最后一次):
文件“/maslestorres.cat/jardiNet_datalogger.py”,第214行,在
main()
文件“/maslestorres.cat/jardiNet_datalogger.py”,第206行,主目录
输入()
EOF:读取一行时的EOF

因此,基本上我不知道如何调整input()行以允许作为守护进程运行。Python是3.7.2版,MacOSX是10.8.5版。

就其本质而言,守护进程无法从控制台启动。您需要另一种方法无限期挂起主线程,同时让XBee继续运行回调

最简单的方法是将
input()
替换为:

while True:
    time.sleep(1000000)    # arbitrarily large number
关闭时,系统的服务管理器将停止守护程序:

  • 通过发送
    SIGTERM
    ——在这种情况下,守护进程将立即终止,而不执行
    finally
  • 或者通过发送
    SIGINT
    -在这种情况下,
    键盘中断
    异常将在
    时间内冒泡。睡眠(1000000)
    ,然后
    最终将运行
无论哪种情况,您的过程都应该快速停止


要获得更正确的解决方案,也能够优雅地处理
SIGTERM
,请参见此处:

就其本质而言,守护进程无法从控制台启动。您需要另一种方法无限期挂起主线程,同时让XBee继续运行回调

最简单的方法是将
input()
替换为:

while True:
    time.sleep(1000000)    # arbitrarily large number
关闭时,系统的服务管理器将停止守护程序:

  • 通过发送
    SIGTERM
    ——在这种情况下,守护进程将立即终止,而不执行
    finally
  • 或者通过发送
    SIGINT
    -在这种情况下,
    键盘中断
    异常将在
    时间内冒泡。睡眠(1000000)
    ,然后
    最终将运行
无论哪种情况,您的过程都应该快速停止


要获得更正确的解决方案,也能够优雅地处理
SIGTERM
,请参阅此处:

请更详细地解释您正在做什么。在您的代码中,
input()
的用途是什么?是否等待用户的批准才能恢复操作?通常,守护进程的整个要点是在没有用户交互的情况下连续运行。input()函数只是为了确保main永不结束并执行回调。繁忙的等待循环-->可以获得类似的行为,虽然True:pass,但显然此循环会浪费CPUDo。我正确地理解,您希望守护进程将设备
打开()
一次,然后无限期地等待数据包,在每个数据包上运行
packet\u received\u callback
?请详细解释您正在做的事情。在您的代码中,
input()
的用途是什么?是否等待用户的批准才能恢复操作?通常,守护进程的整个要点是在没有用户交互的情况下连续运行。input()函数只是为了确保main永不结束并执行回调。繁忙等待循环-->while True:pass也可以获得类似的行为,但显然此循环会浪费CPUDo。我正确地理解,您希望守护进程将设备
打开()
一次,然后无限期地等待数据包,在每个数据包上运行
packet\u received\u callback