IndexError: list index out of range

Frazer1

Lieutenant
Dabei seit
März 2013
Beiträge
613
Hi

als erstes ich bin Linux neuling und bräuchte auch dementsprechende hilfe :D

Ich wollte mal gucken ob ich aus meinem Raspberry Pi ein Audio Dock machen kann und habe auch prompt diese Anleitung gefunden http://blog.jfedor.org/2013/01/usb-audio-dock-for-android.html
Ich habe alles abgearbeitet, aber am ende klappt es doch nicht.
Wenn ich diese Datei ausführen will:


#!/usr/bin/env python

import usb.core
import time
import sys

dev = usb.core.find(idVendor=int(sys.argv[1], 16), idProduct=int(sys.argv[2], 16))
mesg = dev.ctrl_transfer(0xc0, 51, 0, 0, 2)
# here we should check if it returned version 2
time.sleep(1)
# requesting audio
dev.ctrl_transfer(0x40, 0x3a, 1, 0, "")
# putting device in accessory mode
dev.ctrl_transfer(0x40, 53, 0, 0, "")


kommt immer die Fehlermeldung:

Traceback (most recent call last):
File "/home/pi/android-usb-audio.py", line 7, in <module>
dev = usb.core.find(idVendor=int(sys.argv[1], 16), idProduct=int(sys.argv[2], 16))
IndexError: list index out of range


Bissher habe ich keine Lösung gefunden, und würde mich über jegliche Hilfe freuen

Vielen Dank

Frazer
 

aki

~amd64
Teammitglied
Dabei seit
Feb. 2002
Beiträge
3.436
Hi

Die Frage ist jetzt eigentlich, wie genau du dabei vorgegangen bist. Die anderen Scripte hast du also ebenfalls angelegt und auch genau die gleichen Pfade gewählt? Die Rechte stimmen? Hast du die wichtigen Stellen angepasst wie gefordert?

mfg
aki
 

Frazer1

Lieutenant
Ersteller dieses Themas
Dabei seit
März 2013
Beiträge
613
Meines Wissens ja, ich habe auch nochmal alles geprüft und mir sind keine Fehler aufgefallen, aber das heiß leider nicht immer viel

Ich habe auch überlegt, nochmal von vorne anzufangen und alles doppelt und dreifach zu prüfen

EDIT: Bei dem einen Schritt war ich mir auch nicht sicher:

ACTION=="add",SUBSYSTEM=="usb",ATTR{idVendor}=="04e8",ATTR{idProduct}=="685c",RUN+="/home/pi/phone_docked.sh %s{idVendor} %s{idProduct}"

hier musste ich die ids ersetzen und hab dan wie gehießen "lsusb" ausgeführt, da kam raus:

Bus 001 Device 007: ID 18d1:4ee2 Google Inc.

Jetzt habe ich einfach für idVendor 18d1 eingesetzt und für idProduct 4ee2
war das richtig?
 
Zuletzt bearbeitet:

aki

~amd64
Teammitglied
Dabei seit
Feb. 2002
Beiträge
3.436
Nur um sicher zu gehen, du hast da jetzt nicht ATTR{18d1} stehen sondern ATTR{idVendor}=="18d1", ja? :D Ansonsten sollten die Werte soweit erstmal stimmen.
 

Frazer1

Lieutenant
Ersteller dieses Themas
Dabei seit
März 2013
Beiträge
613
Ja hab ich (also ich habs richtig) , und bei idProduct hab ichs auch geändert

Also würdest du sagen, das irgentwo ein abschreibfehler passiert ist?
 
Zuletzt bearbeitet:

aki

~amd64
Teammitglied
Dabei seit
Feb. 2002
Beiträge
3.436
Ich kann dir leider nicht über die Schulter gucken :) Es könnte gut sein, dass beim Kopieren ein Zeilenumbruch verloren gegangen ist oder ähnliches. Grade wenn man von Windows aus sowas bearbeitet, können da unerwünschte Effekte auftreten mit der Formatierung.
 

Frazer1

Lieutenant
Ersteller dieses Themas
Dabei seit
März 2013
Beiträge
613
OK Danke
Da ich heute nix mehr vorhabe schreib ichs nochmal neu und hoffe das beste :D
 

stwe

Lieutenant
Dabei seit
Feb. 2011
Beiträge
654
Das Problem ist eine typische Fehlermeldung von Python, wenn man auf ein Listenelement zugreifen will, dass nicht existiert. In deinem Fall vermute ich, dass sys.argv[1] bzw. sys.argv[2] nicht exisiert. In der sys.argv-Liste stehen die Argumente die an das Skript übergeben werden.

Es kann jetzt entweder sein, dass udev die Parameter "%s{idVendor} %s{idProduct}" nicht an das phone_docked.sh Skript übergibt oder es könnte sein, dass das phone_docked.sh-Skript die Parameter nicht an das Python Skript weitergibt.

Um das herauszufinden, würde ich empfehlen im Shell-Skript z.B. "echo $1; echo $2" o. Ä. einzubauen und dann die Ausgabe zu kontrollieren.

edit: Gerade gelesen:
Wenn ich diese Datei ausführen will:

kommt immer die Fehlermeldung:
Führst du die Datei manuell aus oder meinst du damit, dass die Datei über udev ausgeführt wird? Wenn du sie manuell ausführst, musst du dem Skript natürlich Argumente übergeben (nämlich die Vendor-ID und die Product-ID), z.B. so:
Code:
python android-usb-audio.py 123a 456b
 
Zuletzt bearbeitet:

Frazer1

Lieutenant
Ersteller dieses Themas
Dabei seit
März 2013
Beiträge
613
Da es nicht geklappt hat als ich das Handy drangehängt habe habe ich sie manuell ausgeführt.
Kannst du mir vielleicht erklären, wie ich das machen muss, da keine Rechtschreibfehler vorhanden sind? (also ich habe mit akribischer Präzision nochmal alles abgeschrieben)
Ergänzung ()

z.B. so:
Code:
python android-usb-audio.py 123a 456b
Ich habs grad ausprobiert und dann kommt:
Code:
Traceback (most recent call last):
File "android-usb-audio.py", line 8, in <module>
mesg = dev.ctrl_transfer(0xc0, 51, 0, 0, 2)
AttributeError: 'NoneType' object has no attribute 'ctrl_transfer'
ich denk mal das die werte von dem blog vieleicht veraltet sind, oder ist das doch mir zu verschulden, das es nicht geht?
 

stwe

Lieutenant
Dabei seit
Feb. 2011
Beiträge
654
Was war denn deine genaue Befehlszeile? Du musst natürlich die Vendor- und Product-ID DEINES Devices eintragen, nicht die von dem Blog-Post (und auch nicht die in meinem Beispiel). Diese IDs sind spezifisch für ein bestimmtes Modell.

Die Fehlermeldung "'NoneType' object has no attribute" bedeutet, dass das Skript kein Device mit der angegebenen Vendor-ID/Product-ID finden konnte.

Wie ich sehe, hast du ja schon die IDs deines Handys ausgelesen. Du müsstest das Skript so aufrufen
Code:
python android-usb-audio.py 18d1 4ee2
Ich würde dir auch empfehlen, die komplette Ausgabe aus dem Terminal zu kopieren, wenn du einen Befehl ausführst. Insbesondere ist es wichtig, den BEFEHL mitzukopieren. Aus deinem Blog Post kann ich jetzt nicht entnehmen, ob du einfach meinen Befehl ausgeführt hast oder deine Vendor-/Product-ID eingesetzt hast.

edit:
Da es nicht geklappt hat als ich das Handy drangehängt habe habe ich sie manuell ausgeführt.
Für das automatische Ausführen ist udev verantwortlich. Dafür hast du diese Regel angelegt. Wenn man die Regeln verändert, muss man sie auch noch neu laden. Entweder mittels Neustart oder via:
Code:
sudo udevadm control --reload-rules
Außerdem musst du danach das Device nochmal aus- und wieder einstecken.

Wenn du das Skript manuell ausführst, musst du wie gesagt DEINE Vendor-ID und Product-ID als Befehlszeilenparameter übergeben. Und den Handy muss natürlich angesteckt sein.

Du hättest übrigens das Skript auch kopieren und einfügen können, dann hättest dus nicht abtippen müssen ;)
 
Zuletzt bearbeitet:

Frazer1

Lieutenant
Ersteller dieses Themas
Dabei seit
März 2013
Beiträge
613
Ja danke probiere ich heute abend aus und meld mich dann nochmal
ich habe natürlich meine ID eingesetzt :D

PS: Danke für die bissher geleistet Hilfe und die hoffentlich folgende :D

Edit:

Ok jetzt wird der Ton vom Handy zumidestmal übern usbausgang wiedergegeben, was auch ohne manuelles starten klappt, doch leider kommt aus dem Raspberry Pi 3,5mm Klinkenstecker kein Ton.
Wenn du mir da noch helfen könntest wäre ich dir sehr dankbar :)
 
Zuletzt bearbeitet:

Frazer1

Lieutenant
Ersteller dieses Themas
Dabei seit
März 2013
Beiträge
613
Hey,

ich habs sofort ausprobiert, klappt aber immer noch nicht. Mein erster verdacht war das der Stecker kaputt ist, aber er funktioniert.

Ich probier mal wild rum, vieleicht klappt ja was und jetzt weiß ich wenigstens wonach ich suchen muss.
 
Top