您如何通过 Python(而不是通过 Twisted)运行 Twisted 应用程序?

Posted

技术标签:

【中文标题】您如何通过 Python(而不是通过 Twisted)运行 Twisted 应用程序?【英文标题】:How do you you run a Twisted application via Python (instead of via 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 搜索过,但搜索词似乎太模糊,无法返回任何有意义的响应。

谢谢。

【问题讨论】:

【参考方案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()

【讨论】:

以上是关于您如何通过 Python(而不是通过 Twisted)运行 Twisted 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我通过安装项目而不是 EXE 安装 DLL 以及如何修复它?

如何通过 python 脚本而不是 ipython 使用 SPy 显示高光谱图像?

如何通过 URL 更改而不是页面重定向进行 ajax 加载?

如何通过传递文件对象(而不是磁盘上文件的位置)将 ffmpeg 与 Python 一起使用

如何交替通过 *multiple 参数的值,而不是可以包含任何迭代器或生成器

如何通过名称而不是 IP 地址访问 docker 容器?