2014-12-16 12 views
5

Schwierigkeiten, einen Python-Daemon zu verwenden, um mit Python 3.3.4 arbeiten zu können. Ich benutze die neueste Version des Python-Daemon-3K von PyPi, d. H. 1.5.8Python 3.3.4: Python-Daemon-3K; Wie man runner verwendet

Startpunkt ist der folgende Code gefunden How do you create a daemon in Python? Code ich glaube, ist 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() 

Bei dem Versuch, dies auszuführen, erhalte ich den folgenden Fehler.

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

Alle Zeiger, wie mit Python 3.3.4 oder ein gutes Beispiel für die Verwendung der Läufer in Python-Daemon-3K

Dank derek

Antwort

4

zu arbeiten zu übersetzen, um den Code zum Laufen zu bringen in python3 Sie in der DaemonRunner Klasse eine Änderung vornehmen müssen, können Sie nicht ungepufferte Text IO haben, aber können Sie ungepufferte Bytes IO so den Modus 'wb+' Wechsel funktioniert:

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

Um den Code laufen in python3 machen Sie in der DaemonRunner Klasse

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+') 
eine Änderung vornehmen müssen