扭曲的应用程序没有扭曲

时间:2011-07-07 12:20:50

标签: python twisted daemon

我使用Twisted框架为自己写了一个不错的应用程序。我使用如下命令启动它:

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

效果很好=)

要启动我的应用程序,我使用此命令编写了一个脚本,因为我很懒惰^^ 但是,由于我使用相同的扭曲选项启动我的应用程序,并且我认为脚本shell解决方案很难看,我怎么能在我的应用程序中做同样的事情?我想通过./myapp启动我的应用程序而不需要shell解决。

我试图在扭曲的文档中搜索它并阅读扭曲的源代码但我不理解它,因为它是我的第一个Python应用程序(精彩的语言顺便说一句!)

提前感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

您需要将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设置的特殊myapp.py变量来确定__file__的路径。将此添加到示例中如下所示:

#!/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撰写a plugin。来自Axiom对象 - 数据库项目的axiomatic命令行程序作为一个经过测试的,具有生产价值的示例,说明如何对twistd进行类似的命令行操作,如上所述,但更多全面处理命令行选项,不同的非扭曲运行实用程序功能等。

答案 1 :(得分:0)

您还可以为扭曲的命令创建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()