2014-12-16 15 views
5

Lottare per cercare di far funzionare un demone python usando Python 3.3.4. Sto usando l'ultima versione di python-daemon-3K da PyPi i.e 1.5.8Python 3.3.4: python-daemon-3K; Come usare il corridore

Il punto di partenza è il codice How do you create a daemon in Python? trovato, credo sia 2.x Python.

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() 

Tentativo di eseguire ciò ottengo il seguente errore.

python mydaemon.py start
Traceback (most recent call last): File "mydaemon.py", line 60, in daemon_runner = runner.DaemonRunner(app) 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: can't have unbuffered text I/O

Qualsiasi puntatore come tradurre lavorare con Python 3.3.4 o un buon esempio di utilizzo del corridore in python-daemon-3K

Grazie Derek

risposta

4

per rendere il codice eseguito in python3 è necessario fare un cambiamento nella classe DaemonRunner, non si può avere il testo senza buffer IO, ma si può avere byte senza buffer IO quindi la modifica della modalità di 'wb+' funziona:

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) 
0

per rendere il codice eseguito in python3 è necessario fare un cambiamento nella classe DaemonRunner

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+')