[Twisted-Python] Passing arguments while running a twistd application
Jean-Paul Calderone
exarkun at divmod.com
Fri Oct 31 09:12:19 EDT 2008
On Fri, 31 Oct 2008 12:42:52 +0100, Terry Jones <terry at jon.es> wrote:
>>>>>> "Adriano" == Adriano Marques <py.adriano at gmail.com> writes:
>Adriano> I have a twisted application, which formely was run with command
>Adriano> line arguments which were used during runtime, eg: I was passing
>Adriano> the path to the log file as argument. Then, I decided to make my
>Adriano> app run through twistd as a tac file but then I'm not able to pass
>Adriano> command line arguments anymore. Is there any way to overcome this
>Adriano> issue?
>
>I also ran into this, and asked for some way to pass args but got told
>(paraphrasing, from memory) that that's not the way to do it...
To add slightly to this correct answer:
The "tac" in a .tac file stands for "Twisted Application Configuration".
The reason you cannot pass extra arguments on the command line when using
a .tac file is that the intent is for all configuration to be in the .tac
file. So if this isn't appropriate for your application, a twistd plugin
is probably a better solution.
>The way to do it seems to be to convert your application to be a Twisted
>plugin. It's not too hard. Then you make sure there's a twisted/plugins
>dir accessible from your path (with no __init__.py files in/under it). Then
>twistd will find your plugin (just run twistd with no options and you
>should see your plugin name listed at the bottom among the commands). Then
>you can add options processing by subclassing the Options class in
>twisted.python.usage.
>
>Sorry to be so terse - no time. The above does work though, and seems to be
>the Twisted way. Rough (untested) guideline code below.
>
>Terry
>
>---
>
>from zope.interface import implements
>from twisted.python import usage
>from twisted.plugin import IPlugin
>from twisted.application.service import IServiceMaker
>from ???? import myservice
>
>class Options(usage.Options):
> optFlags = [
> ['verbose', None, 'If True, be verbose.'],
> ]
> optParameters = [
> ['port', 'p', '0', 'The port number to listen on.'],
> ]
>
>class MyServiceMaker(object):
> implements(IServiceMaker, IPlugin)
> # The tapname will appear in the output of twistd when run with no args.
> # Use twistd -n my-plugin-name
> # to invoke it.
> tapname = 'my-plugin-name'
> description = 'My snazzy service.'
> options = Options
>
> def makeService(self, options):
> return myservice(
> options['port'], options['verbose'])
>
>serviceMaker = MyServiceMaker()
>
Fortunately, in case the above misses anything or you'd like any parts
of it explained, there is documentation about writing plugins. :)
http://twistedmatrix.com/projects/core/documentation/howto/plugin.html
http://twistedmatrix.com/projects/core/documentation/howto/tap.html
Jean-Paul
More information about the Twisted-Python
mailing list