2009-12-13 3 views
19

Ich arbeite mich durch das Lernen Twisted, und bin über etwas gestolpert, ich bin mir nicht sicher, dass ich schrecklich gern - die "Twisted Command Prompt". Ich bin das Hantieren mit Verdrehte auf meinem Windows-Rechner, und versucht, die „Chat“ Beispiel läuft:Wie laufen Sie eine Twisted-Anwendung über Python (anstatt über 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) 

jedoch diese Anwendung als Twisted-Server laufen zu lassen, muss ich es über die „Twisted Eingabeaufforderung“ laufen , mit dem Befehl:

twistd -y chatserver.py 

gibt es eine Möglichkeit, den Code (Satz Verdrehte Konfigurationseinstellungen usw.) zu ändern, so dass ich es einfach über laufen kann:

python chatserver.py 

ich habe gegoogelt, bu Die Suchbegriffe scheinen zu vage zu sein, um aussagekräftige Antworten zu geben.

Danke.

Antwort

22

Ich weiß nicht, ob es der beste Weg, dies zu tun, aber was ich tun ist, statt:

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

Sie tun können:

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

zusammenzufassen versucht, wenn Sie das haben wollen zwei Optionen (Twisted und 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) 

Hoffe es hilft!

+0

Das war genau das, was ich gesucht habe. Danke vielmals. –

+0

In neueren Versionen von Twisted sollten Sie normalerweise Endpunkte verwenden, anstatt die Reaktormethoden direkt aufzurufen. Ersetzen Sie in diesem Beispiel die Zeile 'listenTCP' durch . Dies ist flexibler, da Sie Endpunkte weitergeben können, ohne sie unbedingt zu starten. In neueren Versionen von Twisted wird es immer mehr Tools geben, mit Endpunkten zu arbeiten, also ist es ein bisschen zukunftssicherer. – Glyph

+0

Was ist mit der Bereitstellung dieses Pakets? Idealerweise möchte ich meinen Server nach der Installation in einem virtualenv mit einem einzigen Befehl starten. Wie wird empfohlen, Ihr Serverscript zusammen mit Ihrem Paket zu versenden? – Chris

1

Ich habe mich nicht selbst verdreht verwendet. Sie können jedoch versuchen zu sehen, ob die Twisted selbst eine Python-Datei ist. Ich würde annehmen, dass es einfach das Laden der entsprechenden verdrehten Bibliotheken vom richtigen Pfad verwaltet.

2

Unter Windows können Sie .bat-Datei mit Ihrem Befehl darin erstellen, verwenden Sie vollständige Pfade, dann klicken Sie einfach auf sie, um zu starten.

Zum Beispiel verwende ich:

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

Diese Datei, twistd.py, scheint sehr klein.Gibt es eine Möglichkeit, dies am Anfang einer Anwendung zu integrieren, so dass ich es einfach über die normale Python-Exe ausführen kann? –

15

Verwechseln "Twisted" nicht mit "twistd". Wenn Sie "twistd" verwenden, geben Sie das Programm mit Python ausgeführt. "twistd" ist ein Python-Programm, das unter anderem eine Anwendung aus einer .tac Datei laden kann (wie Sie es hier tun).

Die "Twisted Command Prompt" ist ein Twisted-Installer-zur Verfügung gestellt Bequemlichkeit, um Menschen auf Windows zu helfen. Es wird nur %PATH% gesetzt, um das Verzeichnis mit dem Programm "twistd" einzuschließen. Sie können twistd von einer normalen Eingabeaufforderung aus ausführen, wenn Sie% PATH% richtig festlegen oder mit dem vollständigen Pfad aufrufen.

Wenn Sie damit nicht zufrieden sind, können Sie Ihre Frage möglicherweise erweitern, um eine Beschreibung der Probleme zu erhalten, die bei der Verwendung von "twistd" auftreten.

2

Vielleicht einer der run oder runApp in twisted.scripts.twistd Module wird für Sie arbeiten. Bitte lass es mich wissen, wenn es so ist, es wird nett zu wissen sein!