python脚本作为守护进程运行失败(读取一行时为EOFError:EOF)
我已经创建了一个python3脚本,它可以在命令行上正常运行,但是当我尝试在MacosX中作为守护进程运行时,会出现错误“eoferor:EOF when reading a line”。基本代码如下: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
(...)
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
?