2009-12-13 11 views
19

Estoy trabajando para aprender Twisted, y he tropezado con algo que no estoy seguro de que sea terriblemente aficionado: el "Twisted Command Prompt". Estoy perder el tiempo con trenzado en mi máquina de Windows, y trató de ejecutar el "Chat" ejemplo:¿Cómo ejecutas una aplicación Twisted a través de Python (en lugar de a través de Twisted)?

from twisted.protocols import basic 

class MyChat(basic.LineReceiver): 
    def connectionMade(self): 
     print "Got new client!" 
     self.factory.clients.append(self) 

    def connectionLost(self, reason): 
     print "Lost a client!" 
     self.factory.clients.remove(self) 

    def lineReceived(self, line): 
     print "received", repr(line) 
     for c in self.factory.clients: 
      c.message(line) 

    def message(self, message): 
     self.transport.write(message + '\n') 


from twisted.internet import protocol 
from twisted.application import service, internet 

factory = protocol.ServerFactory() 
factory.protocol = MyChat 
factory.clients = [] 

application = service.Application("chatserver") 
internet.TCPServer(1025, factory).setServiceParent(application) 

Sin embargo, para ejecutar esta aplicación como un servidor de trenzado, tengo que correr a través de la "Símbolo del trenzado de comandos" , con el comando:

twistd -y chatserver.py 

¿hay alguna forma de cambiar el código (ajustes de configuración de juegos de Twisted, etc.), de modo que simplemente se puede ejecutar a través de:

python chatserver.py 

Googled, bu t los términos de búsqueda parecen ser demasiado vagos para devolver respuestas significativas.

Gracias.

Respuesta

22

No sé si es la mejor manera de hacer esto, pero lo que hago es en lugar de:

application = service.Application("chatserver") 
internet.TCPServer(1025, factory).setServiceParent(application) 

que puede hacer:

from twisted.internet import reactor 
reactor.listenTCP(1025, factory) 
reactor.run() 

sintetizábamos si usted quiere tener la dos opciones (twistd y python):

if __name__ == '__main__': 
    from twisted.internet import reactor 
    reactor.listenTCP(1025, factory) 
    reactor.run() 
else: 
    application = service.Application("chatserver") 
    internet.TCPServer(1025, factory).setServiceParent(application) 

espero que ayude!

+0

Esto fue EXACTAMENTE lo que estaba buscando. Gracias una tonelada. –

+0

En las versiones más nuevas de Twisted, generalmente debería usar puntos finales en lugar de llamar directamente a los métodos de reactores. En este ejemplo, reemplace la línea 'listenTCP' con . Esto es más flexible, porque puede pasar por los puntos finales sin necesariamente iniciarlos. En las versiones más nuevas de Twisted, habrá cada vez más herramientas para trabajar con endpoints, por lo que es un poco más a prueba de futuro. – Glyph

+0

¿Qué hay de implementar esto con su paquete. Idealmente, me gustaría iniciar mi servidor con un solo comando después de haberlo instalado en Virtualenv. ¿Cuál es la forma recomendada de enviar el script del servidor junto con su paquete? – Chris

1

No he usado twisted myself. Sin embargo, puede intentar ver si el twistd es un archivo python. Me atrevo a suponer que simplemente se trata de administrar las bibliotecas twisted apropiadas desde la ruta correcta.

2

En Windows puede crear un archivo .bat con su comando, usar rutas completas, luego hacer clic en él para iniciar.

Por ejemplo yo uso:

runfileserver.bat: 
C:\program_files\python26\Scripts\twistd.py -y C:\source\python\twisted\fileserver.tac 
+0

Ese archivo, twistd.py, parece muy pequeño.¿Hay alguna manera de incluir eso al principio de una aplicación para que pueda ejecutarlo a través del ordinario Python Exe? –

15

no hay que confundir "Twisted" con "twistd". Cuando usa "twistd", es ejecutando el programa con Python. "twistd" es un programa de Python que, entre otras cosas, puede cargar una aplicación desde un archivo .tac (como lo está haciendo aquí).

La "Instrucción de comando Twisted" es una conveniencia proporcionada por el instalador Twisted para ayudar a las personas en Windows. Todo lo que hace es establecer %PATH% para incluir el directorio que contiene el programa "twistd". Puede ejecutar twistd desde un símbolo del sistema normal si configura su% PATH% correctamente o lo invoca con la ruta completa.

Si no está satisfecho con esto, quizás pueda ampliar su pregunta para incluir una descripción de los problemas que tiene cuando usa "twistd".

2

Tal vez uno de run o en twisted.scripts.twistd módulos funcionará para usted. Por favor, avíseme si lo hace, será bueno saberlo!

Cuestiones relacionadas