2009-12-13 13 views
19

Sto lavorando per imparare Twisted, e sono incappato in qualcosa che non sono sicuro di amare terribilmente - il "Twisted Command Prompt". Sto trafficando con Twisted sulla mia macchina Windows e provato a fare funzionare l'esempio "Chat":Come si esegue un'applicazione Twisted tramite Python (anziché tramite 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) 

Tuttavia, per eseguire questa applicazione come un server Contorto, devo correre tramite il "Prompt ritorto dei comandi" , con il comando:

twistd -y chatserver.py 

c'è un modo per modificare il codice (set ritorto le impostazioni di configurazione, ecc) in modo che possa eseguire semplicemente tramite:

python chatserver.py 

Googled, bu i termini di ricerca sembrano troppo vaghi per restituire risposte significative.

Grazie.

risposta

22

Non so se è il modo migliore per fare questo, ma quello che faccio è invece di:

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

si può fare:

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

Sumarized se si vuole avere la due opzioni (twistd e 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) 

Spero che aiuti!

+0

Questo era ESATTAMENTE quello che stavo cercando. Grazie mille. –

+0

Nelle versioni più recenti di Twisted, in genere si dovrebbero utilizzare gli endpoint anziché chiamare direttamente i metodi del reattore. In questo esempio, sostituire la riga 'listenTCP' con . Questo è più flessibile, perché è possibile aggirare gli endpoint senza necessariamente avviarli. Nelle versioni più recenti di Twisted, ci saranno sempre più strumenti per lavorare con gli endpoint, quindi è un po 'più a prova di futuro. – Glyph

+0

Che ne pensi di distribuire questo con il tuo pacchetto. Idealmente, vorrei iniziare il mio server con un singolo comando dopo che è stato installato in un virtualenv. Qual è il modo consigliato di spedire lo script del server insieme al pacchetto? – Chris

1

Non ho usato me stesso. Tuttavia, si può provare a vedere se il twistd è un file Python stesso. Direi che sta semplicemente gestendo il caricamento delle appropriate librerie contorte dal percorso corretto.

2

Su Windows è possibile creare il file .bat con il comando in esso, utilizzare percorsi completi, quindi fare clic su di esso per avviare.

Per esempio io uso:

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

Quel file, twistd.py, sembra molto piccolo.C'è un modo per includerlo all'inizio di un'applicazione in modo che io possa semplicemente eseguirlo tramite il normale python exe? –

15

non confondere "ritorto" con "twistd". Quando si utilizza "twistd", è in esecuzione il programma con Python. "twistd" è un programma Python che, tra le altre cose, può caricare un'applicazione da un file .tac (come si fa qui).

Il "Prompt dei comandi Twisted" è un programma di installazione Twisted, che consente di aiutare gli utenti su Windows. Tutto ciò che sta facendo è impostare %PATH% per includere la directory contenente il programma "twistd". È possibile eseguire twistd da un normale prompt dei comandi se si imposta% PATH% correttamente o lo si richiama con il percorso completo.

Se non sei soddisfatto, forse puoi estendere la domanda per includere una descrizione dei problemi riscontrati durante l'utilizzo di "twistd".

2

Forse uno di run o runApp in twisted.scripts.twistd moduli funzionerà per voi. Per favore fatemi sapere se lo fa, sarà bello sapere!

Problemi correlati