Витое приложение без твиста

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

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

Работает отлично =)

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

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

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

1 ответ

Решение

Вам необходимо импортировать 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.

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

Вы также можете создать options / config для скрученной команды и передать ее скрученному бегуну.

#!/usr/bin/env python3

import twisted.scripts.twistd
import twisted.scripts._twistd_unix

config = twisted.scripts._twistd_unix.ServerOptions()
config.parseOptions([
  "--nodaemon",
  "web",
  "--listen=tcp:80",
  "--path=/some/path"
])
twisted.scripts._twistd_unix.UnixApplicationRunner(config).run()
Другие вопросы по тегам