【问题标题】:How do you you run a Twisted application via Python (instead of via Twisted)?您如何通过 Python(而不是通过 Twisted)运行 Twisted 应用程序?
【发布时间】:2010-12-26 06:11:37
【问题描述】:

我正在努力学习 Twisted,并且偶然发现了一些我不确定自己是否非常喜欢的东西 - “Twisted 命令提示符”。我在我的 Windows 机器上摆弄 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)

但是,要将这个应用程序作为 Twisted 服务器运行,我必须通过“Twisted 命令提示符”运行它,使用以下命令:

twistd -y chatserver.py

有什么方法可以更改代码(设置 Twisted 配置设置等),以便我可以简单地通过以下方式运行它:

python chatserver.py

我用 Google 搜索过,但搜索词似乎太模糊,无法返回任何有意义的响应。

谢谢。

【问题讨论】:

    标签: python networking sockets twisted


    【解决方案1】:

    我不知道这是否是最好的方法,但我所做的是:

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

    你可以这样做:

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

    总结一下,如果你想要两个选项(twistd 和 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)
    

    希望对你有帮助!

    【讨论】:

    • 这正是我想要的。非常感谢。
    • 在较新版本的 Twisted 中,您通常应该使用端点而不是直接调用反应器方法。在此示例中,将“listenTCP”行替换为 twistedmatrix.com/documents/10.1.0/api/…>。这更灵活,因为您可以绕过端点而不必启动它们。在较新版本的 Twisted 中,也将有越来越多的工具用于处理端点,因此更具前瞻性。
    • 用你的包部署这个怎么样。理想情况下,我想在将服务器安装到 virtualenv 后使用单个命令启动我的服务器。将服务器脚本与包一起发送的推荐方式是什么?
    • @Glyph:你的链接 404s;我认为this 是该文档的最新版本
    • @ssc - 是的,这是正确的链接。感谢您的修复;我会编辑我的评论,但 SO 只允许您编辑相对最近发布的 cmets。
    【解决方案2】:

    不要将“Twisted”与“twistd”混淆。当您使用“twistd”时,您正在使用 Python 运行程序。 “twistd”是一个 Python 程序,除其他外,它可以从 .tac 文件加载应用程序(正如您在此处所做的那样)。

    “Twisted 命令提示符”是一个 Twisted 安装程序,它为帮助 Windows 用户提供了便利。它所做的只是将%PATH% 设置为包含包含“twistd”程序的目录。如果您正确设置 %PATH% 或使用完整路径调用它,则可以从普通命令提示符运行 twistd。

    如果您对此不满意,也许您可​​以扩展您的问题,包括描述您在使用“twistd”时遇到的问题。

    【讨论】:

      【解决方案3】:

      在 Windows 上,您可以在其中创建包含命令的 .bat 文件,使用完整路径,然后只需单击它即可启动。

      例如我使用:

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

      【讨论】:

      • 该文件twistd.py 似乎很小。有什么方法可以在应用程序的开头包含它,以便我可以通过常规的 python exe 运行它?
      【解决方案4】:

      也许twisted.scripts.twistd 模块中的runrunApp 之一对您有用。如果有请告诉我,很高兴知道!

      【讨论】:

        【解决方案5】:

        我自己没用过twisted。但是,您可以尝试查看 twistd 本身是否是 python 文件。我猜它只是管理从正确路径加载适当的扭曲库。

        【讨论】:

          【解决方案6】:

          我成功地在 Windows 上为 Flask 网站使用了简单的 Twisted Web 服务器。 其他人是否也在 Windows 上成功使用 Twisted 来验证该配置?

          new_app.py
          
          if __name__ == "__main__":
              reactor_args = {}
          
              def run_twisted_wsgi():
                  from twisted.internet import reactor
                  from twisted.web.server import Site
                  from twisted.web.wsgi import WSGIResource
          
                  resource = WSGIResource(reactor, reactor.getThreadPool(), app)
                  site = Site(resource)
                  reactor.listenTCP(5000, site)
                  reactor.run(**reactor_args)
          
              if app.debug:
                  # Disable twisted signal handlers in development only.
                  reactor_args['installSignalHandlers'] = 0
                  # Turn on auto reload.
                  import werkzeug.serving
                  run_twisted_wsgi = werkzeug.serving.run_with_reloader(run_twisted_wsgi)
          
              run_twisted_wsgi()
          
          
          old_app.py
          
          if __name__ == "__main__":
              app.run()
          

          【讨论】:

            猜你喜欢
            • 2011-11-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多