Python 3.3.4: python-daemon-3K; How to use a runner

Fighting an attempt to get the python daemon to work using Python 3.3.4. Im using the latest version of python-daemon-3K from PyPi, i.e. 1.5.8

The starting point is the following code found How do you create a daemon in Python? the code I believe is Python 2.x.

import time from daemon import runner class App(): def __init__(self): self.stdin_path = '/dev/null' self.stdout_path = '/dev/tty' self.stderr_path = '/dev/tty' self.pidfile_path = '/tmp/foo.pid' self.pidfile_timeout = 5 def run(self): while True: print("Howdy! Gig'em! Whoop!") time.sleep(10) app = App() daemon_runner = runner.DaemonRunner(app) daemon_runner.do_action() 

Trying to run this, I get the following error.

python mydaemon.py start
Traceback (last last call): File "mydaemon.py", line 60, in daemon_runner = runner.DaemonRunner (application) File "/depot/Python-3.3.4/lib/python3.3/site-packages/python_daemon_3K-1.5 .8-py3.3.egg / daemon / runner.py ", line 89, in init app.stderr_path, 'w +', buffering = 0) ValueError: cannot have unbuffered text input / output

Any pointer on how to translate to work with Python 3.3.4 or a good example of using runner in python-daemon-3K

Thanks Derek

+5
source share
2 answers

In order to make the startup code in Python3 you need to make changes to the DaemonRunner class, you cannot have unbuffered IO text, but you can have unbuffered IO bytes so changing the mode of 'wb+' will work: p>

 class DaemonRunner(object): self.parse_args() self.app = app self.daemon_context = DaemonContext() self.daemon_context.stdin = open(app.stdin_path, 'r') # for linux /dev/tty must be opened without buffering and with b self.daemon_context.stdout = open(app.stdout_path, 'wb+',buffering=0) # w+ -> wb+ self.daemon_context.stderr = open( app.stderr_path, 'wb+', buffering=0) 
+4
source

To execute code in python3, you need to make changes to the DaemonRunner class

 class DaemonRunner(object): self.parse_args() self.app = app self.daemon_context = DaemonContext() self.daemon_context.stdin = open(app.stdin_path, 'r') self.daemon_context.stdout = open(app.stdout_path, 'w+') self.daemon_context.stderr = open(app.stderr_path, 'w+') 
0
source

Source: https://habr.com/ru/post/1209239/


All Articles