Seite 1 von 1
Übergabeparameter aus der shell
Verfasst: Dienstag 2. Januar 2024, 21:11
von ChrisD
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()
Re: Übergabeparameter aus der shell
Verfasst: Dienstag 2. Januar 2024, 21:24
von noisefloor
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
Re: Übergabeparameter aus der shell
Verfasst: Dienstag 2. Januar 2024, 21:31
von __blackjack__
@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.")
Re: Übergabeparameter aus der shell
Verfasst: Dienstag 2. Januar 2024, 21:58
von ChrisD
@__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
Re: Übergabeparameter aus der shell
Verfasst: Dienstag 2. Januar 2024, 22:08
von __deets__
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.
Re: Übergabeparameter aus der shell
Verfasst: Mittwoch 3. Januar 2024, 01:47
von snafu
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.
Re: Übergabeparameter aus der shell
Verfasst: Mittwoch 3. Januar 2024, 08:28
von noisefloor
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