您如何通过 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 模块中的run
或runApp
之一对您有用。如果有请告诉我,很高兴知道!
【讨论】:
【参考方案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 一起使用