Как вы запускаете приложение Twisted через Python (вместо Twisted)?

Я работаю над изучением Twisted и наткнулся на то, что, я не уверен, мне ужасно нравится — «Twisted Command Prompt». Я возился с Twisted на своем компьютере с Windows и попытался запустить пример «Чат»:

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

Я гуглил, но условия поиска кажутся слишком расплывчатыми, чтобы дать какие-либо осмысленные ответы.

Спасибо.


person Mike Trpcic    schedule 13.12.2009    source источник


Ответы (6)


Я не знаю, лучший ли это способ сделать это, но вместо этого я делаю:

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)

Надеюсь, поможет!

person chaos.ct    schedule 13.12.2009
comment
Это было ИМЕННО то, что я искал. Благодаря тонну. - person Mike Trpcic; 14.12.2009
comment
В новых версиях Twisted обычно следует использовать конечные точки, а не напрямую вызывать методы реактора. В этом примере замените строку «listenTCP» на ‹twistedmatrix.com/documents/10.1.0/api/›. Это более гибко, потому что вы можете обходить конечные точки, не обязательно запуская их. В более новых версиях Twisted также будет все больше и больше инструментов для работы с конечными точками, так что это немного более ориентировано на будущее. - person Glyph; 22.09.2010
comment
Как насчет развертывания этого с вашим package. В идеале я хотел бы запустить свой сервер с помощью одной команды после его установки в virtualenv. Каков рекомендуемый способ доставки сценария сервера вместе с пакетом? - person Chris; 03.02.2016
comment
@Glyph: ваша ссылка 404; Я думаю, что это последняя версия документа это имелось в виду - person ssc; 14.07.2016
comment
@ssc - да, это правильная ссылка. Спасибо за исправление; Я бы отредактировал свой комментарий, но SO позволяет редактировать только те комментарии, которые были опубликованы относительно недавно. - person Glyph; 15.07.2016

Не путайте "Twisted" с "twistd". Когда вы используете "twistd", вы запускаете программу с помощью Python. «twistd» — это программа на Python, которая, среди прочего, может загружать приложение из файла .tac (как вы делаете здесь).

«Командная строка Twisted» — это удобство, предоставляемое установщиком Twisted, чтобы помочь людям в Windows. Все, что он делает, это устанавливает %PATH% для включения каталога, содержащего программу "twistd". Вы можете запустить Twistd из обычной командной строки, если правильно настроите %PATH% или вызовете его с полным путем.

Если вас это не устраивает, возможно, вы можете расширить свой вопрос, включив в него описание проблем, возникающих при использовании «twistd».

person Jean-Paul Calderone    schedule 13.12.2009

В Windows вы можете создать файл .bat с вашей командой в нем, использовать полные пути, а затем просто щелкнуть по нему, чтобы запустить.

Например, я использую:

runfileserver.bat:
C:\program_files\python26\Scripts\twistd.py -y C:\source\python\twisted\fileserver.tac
person stefanB    schedule 13.12.2009
comment
Этот файл, twistd.py, кажется очень маленьким. Есть ли способ включить это в начало приложения, чтобы я мог просто запустить его через обычный exe-файл python? - person Mike Trpcic; 14.12.2009

Возможно, один из run или runApp в twisted.scripts.twistd модули будут работать на вас. Пожалуйста, дайте мне знать, если это произойдет, это будет приятно знать!

person Alok Singhal    schedule 13.12.2009

Я сам не использовал скрученный. Тем не менее, вы можете попробовать проверить, является ли твистд самим файлом Python. Я бы предположил, что он просто управляет загрузкой соответствующих искаженных библиотек с правильного пути.

person frogstarr78    schedule 13.12.2009

Я успешно использую простой веб-сервер Twisted на веб-сайтах Windows для Flask. Другие также успешно используют Twisted в Windows для проверки этой конфигурации?

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()
person Howard Rothenburg    schedule 25.10.2019