无扭曲的扭曲应用

Posted

技术标签:

【中文标题】无扭曲的扭曲应用【英文标题】:Twisted application without twistd 【发布时间】:2011-07-07 12:20:50 【问题描述】:

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

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

效果很好 =)

为了启动我的应用程序,我用这个命令编写了一个脚本,因为我很懒^^ 但是由于我使用相同的 twistd 选项启动我的应用程序,并且我认为脚本外壳解决方案很丑陋,我怎么能在我的应用程序中做同样的事情呢?我想通过 ./myapp 来启动我的应用程序,而无需使用 shell。

我尝试在扭曲的文档和阅读扭曲的源代码中搜索它,但我不明白它,因为它是我的第一个 Python 应用程序(顺便说一句,语言很棒!)

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

您需要将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 编写a plugin。 Axiom 对象数据库项目中的axiomatic 命令行程序是一个经过测试的、值得生产的示例,说明如何对twistd 进行与上述类似的命令行操作,但更全面地处理命令-line 选项,不同的非 twistd 运行的实用程序功能,等等。

【讨论】:

您好,感谢您的回答。我已经将我的应用程序编写为插件(现在我知道如何在我的代码选项中设置,如日志文件和 pidfile)。将twistd 包装成一个库正是我想要的:) 你的例子对我来说有点复杂,但我正在尝试! 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()怎么样【参考方案2】:

您还可以为一个 twisted 命令创建选项/配置并将其传递给 twisted runner。

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

【讨论】:

以上是关于无扭曲的扭曲应用的主要内容,如果未能解决你的问题,请参考以下文章

在 WSGI 容器中使用扭曲的词

粘糊糊的-服务.tac(扭曲的应用程序框架)

扭曲多边形(像 Photoshop 的扭曲)(透视变换)

为啥 Android Studio Emulator 会扭曲背景图片

OpenCV:录制扭曲的视频

Polymer - 波纹动画扭曲英雄动画