Eine Antwort schreiben

Schreibe deinen Beitrag und versende ihn
Beitragsoptionen
Deine Antwort

Zurück

Themen-Übersicht (Neuester Beitrag zuerst)

nik
14.03.2019 08:16:47

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.

Galde75
14.03.2019 00:10:33

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.

Whitie
13.03.2019 11:45:28

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.

schard
13.03.2019 09:32:40

Schau dir Mal argparse aus der Standardbibliothek und docopt an.

drcux
13.03.2019 07:59:22

Wo hast du denn dieses Konstrukt her?

"['play']"
Galde75
13.03.2019 03:51:23

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?

Fußzeile des Forums

Powered by FluxBB