Витое приложение без твиста - PullRequest
5 голосов
/ 07 июля 2011

Я написал хорошее приложение для себя, используя Twisted Framework.Я запускаю его с помощью команды вроде:

twistd -y myapp.py --pidfile=/var/run/myapp.pid --logfile=/var/run/myapp.log

Это прекрасно работает =)

Чтобы запустить свое приложение, я написал скрипт с этой командой, потому что я ленивый ^^ Но так как я запускаюмое приложение с той же опцией twistd, и я полагаю, уродливое решение для скриптов, как я могу сделать то же самое, но внутри моего приложения?Я хотел бы запустить свое приложение, просто выполнив ./myapp и не обходясь без оболочки.

Я попытался найти его в искаженной документации и прочитав искаженный источник, но я не понимаю этого.так как это мое первое приложение на Python (кстати, замечательный язык!)

Заранее спасибо за любую помощь.

1 Ответ

6 голосов
/ 07 июля 2011

Вам необходимо импортировать скрипт twistd как модуль из Twisted и вызвать его.Самым простым решением для этого, используя существующую командную строку, было бы импортировать модуль sys вместо командной строки argv, чтобы он выглядел так, как вы хотите, чтобы twistd запускался, а затем запустите его.

Вот простой пример сценария, который возьмет вашу существующую командную строку и запустит ее с помощью сценария Python вместо сценария оболочки:

#!/usr/bin/python
from twisted.scripts.twistd import run
from sys import argv
argv[1:] = [
    '-y', 'myapp.py',
    '--pidfile', '/var/run/myapp.pid',
    '--logfile', '/var/run/myapp.log'
]
run()

Если вы хотите аккуратно связать это в пакет,чем жестко заданные пути, вы можете определить путь к myapp.py, посмотрев на специальную переменную __file__, установленную Python в каждом модуле.Добавление этого к примеру выглядит следующим образом:

#!/usr/bin/python
from twisted.scripts.twistd import run
from my.application import some_module
from os.path import join, dirname
from sys import argv
argv[1:] = [
    '-y', join(dirname(some_module.__file__), "myapp.py"),
    '--pidfile', '/var/run/myapp.pid',
    '--logfile', '/var/run/myapp.log'
]
run()

, и вы, очевидно, могли бы делать аналогичные вещи для вычисления соответствующих путей pidfile и logfile.

Более полное решение заключается в написании aплагин для twistd.Программа командной строки axiomatic из проекта объектной базы данных Axiom служит проверенным, достойным производства примером того, как выполнять манипуляции с командной строкой twistd аналогично тому, что описано выше, но скомплексная обработка параметров командной строки, различных функций, не запускаемых программой twistd, и т. д.

...