#1 13.03.2019 03:51:23

Galde75
Mitglied

[Erledigt] Python Script um Optionen erweitern

Verwende normalerweise andere Sprachen zum scripten, und kenn mich daher nicht so mit Python aus.

Ich habe folgendes Script:

from mpd import MPDClient
client = MPDClient()                          # create client object
client.timeout = 10                             # network timeout in seconds (floats allowed), default: None
client.idletimeout = None                  # timeout for fetching the result of the idle command is handled seperately, default: None
client.connect("xxx.xxx.x.x", 6600)  # connect to localhost:6600
client.password("xxxxxxx")

client.play()              # send command

client.close()							# send the close command
client.disconnect()						# disconnect from the server

Womit ich vom Desktop aus meinen MPD Server steuern möchte, da dies auch unter Windows funktionieren soll hab ich Python gewählt (mache einfache Sachen unter Linux sonst eher mit Bashscripten)
Das Script funktioniert auch einwandfrei.

Nun möchte ich jedoch anstatt für jedes Kommando ein eigenes Script zu haben den Befehl an das Script übergeben.
Nach langen Google-Sessions bin bis jetzt soweit gekommen:

import sys
from mpd import MPDClient             #  python-mpd2 is needed
EINGABE = sys.argv[1:]
client = MPDClient()                         # create client object
client.timeout = 10                            # network timeout in seconds (floats allowed), default: None
client.idletimeout = None                 # timeout for fetching the result of the idle command is handled seperately, default: None
client.connect("xxx.xxx.x.x", 6600)	 # connect to localhost:6600
client.password("xxxxxxxxx")

print(EINGABE)

if EINGABE[1:] == "['play']":
	def CMD():
		client.play();
elif EINGABE == "['stop']":
	def CMD():
		client.stop();
elif EINGABE == "['pause']":
	def CMD():
		client.pause();
elif EINGABE == "['next']":
	def CMD():
		client.next();
elif EINGABE == "['previous']":
	def CMD():
		client.previous();
else:
	def CMD():	
		print(client.status());


#client.command_list_ok_begin()
CMD()
#client.command_list_end()
client.close()
client.disconnect()

Verbindungsaufbau und Trennung funktioniert, jedoch wird nur die in "else" angebene Funktion ausgeführt.

Was mach ich falsch?
Wenn ich zum Beispiel "python Scriptname.py stop" eingebe steht der "print(EINGABE)" Ausgabe

['stop']

, womit das dann natürlich in den if Abfragen eingetragen hab.
War das falsch? Ist das überhaupt normal das "sys.argv" (hab nix anderes brauchbares gefunden) noch zusätzlich den Scriptnamen etc mit ausgibt?

Beitrag geändert von Galde75 (08.06.2019 14:41:41)

Offline

#2 13.03.2019 07:59:22

drcux
Mitglied

Re: [Erledigt] Python Script um Optionen erweitern

Wo hast du denn dieses Konstrukt her?

"['play']"

Offline

#3 13.03.2019 09:32:40

schard
Moderator

Re: [Erledigt] Python Script um Optionen erweitern

Schau dir Mal argparse aus der Standardbibliothek und docopt an.

Offline

#4 13.03.2019 11:45:28

Whitie
Mitglied

Re: [Erledigt] Python Script um Optionen erweitern

Hallo Galde75,
ja es ist normal, dass in sys.argv als erstes der Skriptname steht. Das sollte in anderen Sprachen aber auch so sein.
Zu deiner anderen Frage, sys.argv ist eine Liste. Einzelne Elemente bekommst du über den Index, z. B. sys.argv[1] für das zweite Element.

Ungetestet:

import sys

from argparse import ArgumentParser
from mpd import MPDClient


def main():
    parser = ArgumentParser()
    parser.add_argument(
        'command', choices=['play', 'stop', 'pause', 'next', 'previous',
        'status']
    )
    args = parser.parse_args()
    client = MPDClient()
    client.timeout = 10
    client.idletimeout = None
    client.connect("xxx.xxx.x.x", 6600)
    client.password("xxxxxxxxx")
    func = getattr(client, args.command)
    if args.command == 'status':
        print(func())
    else:
        func()


if __name__ == '__main__':
    main()

Gruß Whitie

Edit: Code für Ausgabe von "status" angepasst.

Beitrag geändert von Whitie (14.03.2019 08:17:31)

Offline

#5 14.03.2019 00:10:33

Galde75
Mitglied

Re: [Erledigt] Python Script um Optionen erweitern

Danke für die Hilfen. Dein Beispiel funktioniert zu 99%.
schön einfach und übersichtlich dargestellt, und kann es so halbwegs nachvollziehen was dort passiert.

Nur Kommando "status" funktioniert nicht, da es die einzige Funktion in dieser Auswahl ist die einen Wert (den Status eben) wieder zurück bekommt (Es gibt noch andere Kommandos mit Rückgabewert, die ich aber in diesem Script nicht brauche) .


War schon vor grob 2 Tagen auf Argumentparser gestossen, allerdings war das auf der Website so dermassen kompliziert und unübersichtich (Weil da noch die ganzen Zusatzoptionen mit aufgeführt waren)
das ich da überhaupt nicht durchgeblickt hab und es dann verworfen habe.


drcux schrieb:

Wo hast du denn dieses Konstrukt her?

"['play']"

Weil ich per

EINGABE = sys.argv[1:]
print(EINGABE)

Als Augabe

['Eingegebener Wert']

bekomme.
Und von Bash-Scripten bin ich es eben gewohnt bei Anführungszeichen zu setzen. Hab ja bisher praktisch nichts mit Python zu tun gehabt.

Beitrag geändert von Galde75 (14.03.2019 00:12:02)

Offline

#6 14.03.2019 08:16:47

nik
Mitglied

Re: [Erledigt] Python Script um Optionen erweitern

Das Tutorial zu argparse hast du auch gefunden?

Das fand ich eigentlich ziemlich übersichtlich, vor allem weil man sich dort auch einfach nur die Beispiele rauspicken kann, die man wirklich braucht.

Offline

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums