2011-07-07 12 views
5

He escrito una buena aplicación para mí con el framework Twisted. Lanzo usando un comando como:Twisted application without twistd

twistd -y myapp.py --pidfile=/var/run/myapp.pid --logfile=/var/run/myapp.log 

Funciona muy bien =)

Para iniciar mi aplicación escribí un script con este comando porque soy perezoso ^^ Pero desde que lanzar mi aplicación con la misma opción twistd, y creo que la solución shell de script es fea, ¿cómo puedo hacer lo mismo pero dentro de mi aplicación? Me gustaría iniciar mi aplicación simplemente haciendo ./myapp y sin un caparazón.

He tratado de buscar al respecto en la documentación retorcido y mediante la lectura de la fuente retorcida pero yo no lo entiendo, ya que es mi primera aplicación en Python (lengua maravillosa por cierto!)

Gracias de antemano por anyhelp.

Respuesta

4

Tiene que importar el script twistd como un módulo de Twisted e invocarlo. La solución más simple para esto, usando su línea de comando existente, sería importar el módulo sys para reemplazar la línea de comando argv para que se vea como desea que twistd se ejecute, y luego ejecutarlo.

Aquí hay un script de ejemplo simple que se llevará a su línea de comandos existente y ejecutarlo con un script en Python en lugar de un script de shell:

#!/usr/bin/python 
from twisted.scripts.twistd import run 
from sys import argv 
argv[1:] = [ 
    '-y', 'myapp.py', 
    '--pidfile', '/var/run/myapp.pid', 
    '--logfile', '/var/run/myapp.log' 
] 
run() 

Si desea agrupar esta muy bien en un paquete en lugar de rutas de codificación fija, puede determinar la ruta al myapp.py al observar la variable especial __file__ establecida por Python en cada módulo. Agregando a esto el ejemplo se ve así:

#!/usr/bin/python 
from twisted.scripts.twistd import run 
from my.application import some_module 
from os.path import join, dirname 
from sys import argv 
argv[1:] = [ 
    '-y', join(dirname(some_module.__file__), "myapp.py"), 
    '--pidfile', '/var/run/myapp.pid', 
    '--logfile', '/var/run/myapp.log' 
] 
run() 

y es obvio que podría hacer algo similar para calcular trayectorias PidFile y del archivo de registro correspondientes.

Una solución más completa es escribir a plugin para twistd. El programa de línea de comandos axiomatic del proyecto de base de datos Axiom sirve como un ejemplo probado y productivo de cómo hacer una manipulación similar de línea de comandos de twistd a lo descrito anteriormente, pero con un manejo más completo de las opciones de línea de comandos, Funcionalidad de utilidad que no funciona con twistd, y así sucesivamente.

+0

Hola, gracias por su respuesta. Ya escribí mi aplicación como un complemento (bueno, ahora sé cómo configurar las opciones de mi código, como logfile y pidfile). Concluir Twistd como una biblioteca es exactamente lo que quiero :) Tu ejemplo es un poco complicado para mí, pero lo estoy intentando. – unpythonicguy

+0

Bueno, lo intenté, pero realmente no entiendo tu ejemplo :( – unpythonicguy

+1

¿Qué tal 'de twisted.scripts.twistd import run; from sys import argv; argv [1:] = ['-y', 'myapp. py ',' --pidfile =/var/run/myapp.pid ',' --logfile =/var/run/myapp.log ']; run() ' –