2014-01-26 7 views
8

Ich Refaktoriere meinen Code Sellerie Arbeiter zu verwenden.Sellerie Arbeiter und Befehlszeile args

Bevor ich verwendet argparse verwenden Befehlszeile args zu übergeben.

z.B.

if __name__ == "__main__": 
    parser = argparse.ArgumentParser(description='Node') 
    parser.add_argument('--environment', action="store", default='local', help="env e.g. production of development") 
    environment = arg_options.environment 

Aber jetzt bekomme ich diesen Fehler.

celery -A tasks worker --loglevel=info --environment local 
celery: error: no such option: --environment 

Wie kann ich hinzufügen?

Ich will nicht, Umgebungsvariable verwenden, wenn ich nicht haben.

e.g export environment=development 

Antwort

9

Der Selleriearbeiter führt Ihre __main__ nicht aus.

Wenn Sie zusätzliche Befehlszeilenoptionen hinzufügen möchten, können Sie app.user_options verwenden, aber beachten Sie, dass es das optparse Modul verwendet, nicht argparse.

Siehe diesen Abschnitt in der Dokumentation für mehr:

http://docs.celeryproject.org/en/latest/userguide/extending.html#preload-options

+2

Ich verstehe, wie Argumente in eine bootstep __init__ Methode zu bekommen, aber wie kann ich Zugriff auf diese Parameter dann von einer Aufgabe? – cacois

+1

Oder wie man sie bekommt ... überhaupt offen gesagt. Stunden verloren auf diesem – chuckjones242

5

Durch den Quellcode suchen, ich habe dies einen Weg gefunden, zu handhaben.

Auf celery.py add:

from celery import bootsteps 
from celery.bin import Option 

.... 
app.user_options['worker'].add(
    Option('--server', dest='api_server', default='127.0.0.1', 
      help='API server to use.') 
) 

app.conf['API_SERVER'] = '127.0.0.1' 

class ConfigBootstep(bootsteps.Step): 
    def __init__(self, worker, api_server=None, **options): 
     app.conf['API_SERVER'] = api_server 

app.steps['worker'].add(ConfigBootstep) 

dann in die Datei Ihre Aufgaben halten fügen Sie diese:

from celery import current_app 
... 
@shared_task() 
def roboscope(): 
    API_SERVER = current_app.conf.get('API_SERVER', '127.0.0.1') 

Ich habe versucht zu machen API_SERVER ein Modul globale Variable durch ihn zu lösen, wenn das Modul importiert aber es funktioniert nicht, weil es zu früh ist. Da meine Aufgabe sehr intensiv ist, schadet es nicht, dies viele Male auszuführen.

+0

Sie können stattdessen 'bootsteps.StartStopStep' Klasse als Basis verwenden. Auf diese Weise können Sie den Wert früher abrufen (und in einer Variablen oder etwas speichern) und sogar den Wert Ihres Arguments beim Start des Arbeiters validieren. – tsionyx

+0

"auf sellery.py add:" Verzeih mir - aber du solltest nicht mit Selleries Namensraum kollidieren. Die Wahl von "sellery.py" wird sicherlich eine Multi-Modul-Anwendung unterbrechen. –

Verwandte Themen