Übergabeparameter aus der shell

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ChrisD
User
Beiträge: 5
Registriert: Mittwoch 18. Oktober 2023, 12:03

Nabend
ich hab da mal eine frage:
wie kann ich einen Parameter / Übergabewert via Shell an ein Pythonsript übergeben.
bei dem script würde ich immer 1 als start parameter übergeben. wie kann ich das ggf über die shell übergeben
thx


def main():
exit = False
session = setup_session()

client.username_pw_set("<UUID From Platform>", "<PWD>")
client.connect("mqttbroker",1 ,1 )

while not exit:
print("Start polling (1)")
print("Stop polling (2)")
print("Exit (3)")

userInput = input("Your choice: ")

if userInput.isdigit():
choice = int(userInput)
if choice == 1:
print("Start polling...")
session.start_polling()
elif choice == 2:
print("Stop polling...")
session.stop_polling()
else:
exit = True
else:
exit = True
print("fini.")


if __name__ == "__main__":
main()
Benutzeravatar
noisefloor
User
Beiträge: 3857
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du kannst sys.argv nutzen (https://docs.python.org/3/library/sys.html#sys.argv). argv enthält die Argumente, die beim Kommandozeilenaufruf übergeben wurden.

sys.argv ist minimalistisch, reicht aber, wenn man nur eine Zahl oder so mitgeben will. Wenn man mehr Kommandozeilenparameter hat sollte man mindestens argparse (https://docs.python.org/3/library/argparse.html) aus der Standardbibliothek nehmen.

Aber:
bei dem script würde ich immer 1 als start parameter übergeben. wie kann ich das ggf über die shell übergeben
Wenn der Startparameter immer 1 ist kann man das doch fest im Skript hinterlegen?

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ChrisD: In `sys.argv` finden sich die Argumente die beim Start übergeben wurden.

Anmerkungen zum Quelltext:

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

`exit` ist überflüssig. Man würde da einfach eine ”Endlosschleife” schreiben und die an der/den entsprechenden Stelle(n) mit `break()` verlassen.

`isdigit()` ist an der Stelle leicht kaputt, weil es Zeichen gibt die da `True` ergeben, sich aber nicht mit `int()` in eine Zahl umwandeln lassen. Und man muss noch nicht mal superexotische Zeichen dafür hernehmen, es geht sogar etwas was auf normalen Tastaturen aufgedruckt ist:

Code: Alles auswählen

In [202]: "²".isdigit()
Out[202]: True

In [203]: int("²")
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[203], line 1
----> 1 int("²")

ValueError: invalid literal for int() with base 10: '²'
Statt zu testen würde man hier einfach umwandeln und auf die Ausnahme entsprechend reagieren.

Code: Alles auswählen

def main():
    session = setup_session()

    client.username_pw_set("<UUID From Platform>", "<PWD>")
    client.connect("mqttbroker", 1, 1)

    while True:
        print("Start polling (1)")
        print("Stop polling (2)")
        print("Exit (3)")

        user_input = input("Your choice: ")

        try:
            choice = int(user_input)
        except ValueError:
            break

        if choice == 1:
            print("Start polling...")
            session.start_polling()
        elif choice == 2:
            print("Stop polling...")
            session.stop_polling()
        else:
            break

    print("fini.")
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
ChrisD
User
Beiträge: 5
Registriert: Mittwoch 18. Oktober 2023, 12:03

@__blackjack__
danke für den ansatz.
muss ich mir morgen noch mal anschauen bekomme da nur fehlermeldungen zurück

@noisefloor
werde ich auch definitiv testen
es geht darum das script später via cron immer am laufen zu haben und nach einem neustart auch automatisch zu starten
schon mal danke
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie soll denn bei einem automatisch gestarteten Script eine Auswahl erfolgen? Weder zum Start noch während der Laufzeit kann die Nutzereingaben verarbeiten. Wenn du zur Laufzeit da irgendwie eingreifen willst, musst du was anderes einsetzten.
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Also ich habe ihn so verstanden, dass bei einem automatischen Start immer die 1 übergeben wird. Die Auswahl soll vermutlich nur bei einem manuellen Start erfolgen können.
Benutzeravatar
noisefloor
User
Beiträge: 3857
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

hat zwar nicht direkt was mit Python zu tun, aber
es geht darum das script später via cron immer am laufen zu haben
Cron ist angestaubt, Stand der Technik ist seit ca. 10 Jahren systemd. Zum automatischen Starten beim Systemstart nimmt man eine systemd Service Unit, zum periodischen Starten zum Zeitpunkt X eine systemd Timer Unit.

Gruß, noisefloor
Antworten