没有twistd的Twisted应用程序

6 投票
2 回答
4331 浏览
提问于 2025-04-16 21:01

我用Twisted框架为自己写了一个不错的应用程序。我是通过类似下面的命令来启动它的:

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

运行得非常好 =)

为了启动我的应用,我写了一个脚本来执行这个命令,因为我比较懒^^。不过,由于我每次都用相同的twistd选项来启动我的应用,我觉得脚本的方式看起来不太好。那么,我该如何在我的应用内部实现同样的功能呢?我希望只需输入 ./myapp 就能启动我的应用,而不需要使用脚本。

我试着在Twisted的文档里查找相关信息,也看了Twisted的源代码,但由于这是我用Python写的第一个应用(顺便说一下,Python真是个好语言!),我还是不太明白。

提前感谢任何帮助。

2 个回答

0

你还可以为一个扭曲的命令创建选项或配置,然后把它传递给扭曲的运行器。

#!/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()
8

你需要把 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 运行的实用功能等进行了更全面的处理。

撰写回答