没有twistd的Twisted应用程序
我用Twisted框架为自己写了一个不错的应用程序。我是通过类似下面的命令来启动它的:
twistd -y myapp.py --pidfile=/var/run/myapp.pid --logfile=/var/run/myapp.log
运行得非常好 =)
为了启动我的应用,我写了一个脚本来执行这个命令,因为我比较懒^^。不过,由于我每次都用相同的twistd选项来启动我的应用,我觉得脚本的方式看起来不太好。那么,我该如何在我的应用内部实现同样的功能呢?我希望只需输入 ./myapp
就能启动我的应用,而不需要使用脚本。
我试着在Twisted的文档里查找相关信息,也看了Twisted的源代码,但由于这是我用Python写的第一个应用(顺便说一下,Python真是个好语言!),我还是不太明白。
提前感谢任何帮助。
2 个回答
你还可以为一个扭曲的命令创建选项或配置,然后把它传递给扭曲的运行器。
#!/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()
你需要把 twistd
脚本作为模块从 Twisted 导入并调用它。最简单的办法是使用你现有的命令行,导入 sys
模块,然后修改 argv
这个命令行参数,让它看起来像你想要的 twistd
运行方式,然后执行它。
这里有一个简单的示例脚本,它会用 Python 脚本来替代 shell 脚本,运行你现有的命令行:
#!/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()
如果你想把这个打包得更好,而不是硬编码路径,你可以通过查看 Python 在每个模块中设置的特殊 __file__
变量来确定 myapp.py
的路径。将这个添加到示例中看起来是这样的:
#!/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 对象数据库项目的 axiomatic 命令行程序是一个经过测试的、适合生产环境的示例,展示了如何对 twistd
进行类似的命令行操作,但它对命令行选项、不同的非 twistd
运行的实用功能等进行了更全面的处理。