Search code examples
pythonfaust

How to specify Faust arguments when using app.main()


Currently I run several workers using the command line with the following syntax:

faust -A <filepath>:app -D <data-log-path> worker -l info -p 6066

and it works fine. But it seems it would be much nicer to run the .py file and have the log-level, data-dir, and port all specified in the:

if __name__ == '__main__':
  app.main()

style. I can't seem to figure out how to add any of the arguments/options listed above to either the defining of the app object (app = faust.App()) or the app.main() funtion. I will just add that I'm not sure it's worth doing anyway, as I plan to run all the workers from a shell script. It was just going to be a way to ensure all workers are given a unique port to run on, but i guess i can hard code that into the shell scrip if required.


Solution

  • The most common way of achieving this is using sys.argv. There's an example of this in the tabletest.py example:

    if __name__ == '__main__':
        import sys
        if len(sys.argv) < 2:
            sys.argv.extend(['worker', '-l', 'info'])
        app.main()
    

    Before continuing, I suggest looking at the worker command line options in faust.cli.worker.

    Assuming you'd like to hard-code your values in a script, what you'd need to do is:

    if __name__ == '__main__':
      import sys
      sys.argv = [__file__, 'worker', '-l', 'info', '-p', '6066', '-f', '<data-log-path>']
      app.main()
    

    With this, you can run yourscript.py without needing to specify options.