Витое приложение без твиста
Я написал хорошее приложение для себя, используя 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()