2014-12-16 9 views
5

Próbujesz uzyskać demona Pythona do pracy z Pythonem 3.3.4. Im przy użyciu najnowszej wersji Pythona-daemon-3K z PyPi tj. 1.5.8Python 3.3.4: python-daemon-3K; Jak korzystać z Runnera

Punktem wyjścia jest następujący kod znaleziony kod How do you create a daemon in Python? Uważam, że jest 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() 

Próba uruchomienia tego powoduje wystąpienie następującego błędu.

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

Każda wskazówka, jak przełożyć do pracy z Python 3.3.4 lub dobry przykład stosując runner w python-demon-3K

Dzięki Derek

Odpowiedz

4

aby uruchomić kod w python3 trzeba dokonać zmiany w klasie DaemonRunner, nie można mieć tekst niebuforowana IO ale można mieć niebuforowane bajtów IO więc zmieniając tryb 'wb+' zadziała:

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

aby uruchomić kod w python3 trzeba dokonać zmiany w klasie 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+')