If then Abfrage

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.
Benutzeravatar
joernius
User
Beiträge: 31
Registriert: Donnerstag 11. Juni 2020, 13:47
Wohnort: Dresden
Kontaktdaten:

Hallo zusammen,

ich versuche eigentlich nur eine einfache If-Then-Abfrage, bzw If-Else nennt sich das wohl...und falle von einer Fehlermeldung in die nächste :cry:

Es geht um zwei-Abfrage-Zweige, einer wird genommen wenn das Modul
libedgetpu.so.1.0
geladen ist, der andere als Fallback.

So in der Art:


Code: Alles auswählen

import importlib

edge_tpu_delegate = importlib.util.find('libedgetpu.so.1.0')

if edge_tpu_delegate is None:

    print("No EdgeTPU detected. Falling back to CPU.")
    def make_interpreter(model_file):
      model_file, *device = model_file.split('@')
      return tflite.Interpreter(
          model_path=model_file
          )

else:
    def make_interpreter(model_file):
      model_file, *device = model_file.split('@')
      return tflite.Interpreter(
          model_path=model_file,
          experimental_delegates=[
              tflite.load_delegate(EDGETPU_SHARED_LIB,
                                   {'device': device[0]} if device else {})
          ])
Die Python-Version ist 3.7

Wenn jemand diese Abfrage lauffähig hinbiegen kann, so würde ich mich freuen :D

Viele Grüße
Jörn
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Auch im neuen Jahr können wir Fehlermeldungen nicht erraten.

Ich verstehe auch ehrlich gesagt nicht, warum du zwei verschiedene Versionen der Funktion vorhalten solltest. Mach die Fallutnerscheidung *in* der Funktion.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was ist denn hier `importlib`? Denn `importlib.util` aus der Standardbibliothek kennt keine `find()`-Funktion. Und dürfte auch eher nicht mit so einer „shared library“ klar kommen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

@sparrow: bei so Sachen, ob eine Bibliothek vorhanden ist, sind solche if-Abfragen nicht unüblich.

@joernius: Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4 und mal 2.
Und wo ist das Problem?
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: Naja, das hier:

Code: Alles auswählen

In [309]: import importlib.util

In [310]: importlib.util.find('libedgetpu.so.1.0')                              
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-308-076194ef8263> in <module>
----> 1 importlib.util.find('libedgetpu.so.1.0')

AttributeError: module 'importlib.util' has no attribute 'find'
Hat natürlich nichts mit dem ``if`` zu tun.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
joernius
User
Beiträge: 31
Registriert: Donnerstag 11. Juni 2020, 13:47
Wohnort: Dresden
Kontaktdaten:

Da war ja nur ein Beispiel. Hatte ich als Anregung aus dem Netz.

Methoden und Verfahren sind mir egal, ich will ja nur eine Fallunterscheidung. Kann auch ganz anders aussehen.

Habe von Python keine Ahnung, komme aber hier nicht drumherum.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@joernius: Du hast eine Fallunterscheidung. Und immer noch nicht verraten was das Problem damit ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
joernius
User
Beiträge: 31
Registriert: Donnerstag 11. Juni 2020, 13:47
Wohnort: Dresden
Kontaktdaten:

Ups, ich nahm an, meine ersten Sätze sind verständlich.

Wie Du in dem anderen Thread vorschlugst, die Zeilen

Code: Alles auswählen

         experimental_delegates=[
              tflite.load_delegate(EDGETPU_SHARED_LIB,
                                   {'device': device[0]} if device else {})
auszukommentieren, weißt Du noch?

Also, ist das Modul libedgetpu.so.1.0 geladen, dann ist der Coral-Acculator angesteckt, dann soll experimental_delegates=[ ... durchlaufen werden.
Wenn nicht, darf das nicht aufgerufen werden.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@joernius: Das ist irgendwie falsch herum. Was heisst denn „wenn das geladen ist“? Der Code da *lädt* das ja. Du willst eine Entscheidung auf Grund von etwas fällen was erst gemacht werden soll wenn die Entscheidung… das ist ein Zirkelschluss.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
joernius
User
Beiträge: 31
Registriert: Donnerstag 11. Juni 2020, 13:47
Wohnort: Dresden
Kontaktdaten:

Das ist ja kein Modul im Sinne der Programmiersprache. Eher eine Bibliothek, welche ansprechbar wird, wenn die Hardware gesteckt ist.
Es wird also erkannt, ob libedgetpu.so.1.0 verfügbar ist.
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@joernius: Wo wird das erkannt? Was passiert denn wenn diese Hardware (oder Bibliothek) nicht vorhanden ist?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
joernius
User
Beiträge: 31
Registriert: Donnerstag 11. Juni 2020, 13:47
Wohnort: Dresden
Kontaktdaten:

Dann bricht das Skript mit einer Fehlermeldung mit einem Hinweis zu dieser Bibliothek ab.

Vielleicht wäre ein andere Weg den Fehler zu ignorieren, wenn das geht, dann bei Fehler einen andere Verzweigung zu wählen.
Das original Skript war ja das: https:/ ... &t=50882&e

Eine Bastellösung wäre natürlich, die USB-Schnittstelle abzufragen ob ein Gerät von Google angeschlossen ist und dann entweder das Skript mit den auskommentierten "experimental_delegates=[.."-Zweig, oder das andere Skript mit der TPU-Unterstützung laufen zu lassen. Aber eben wenig elegant....
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@joernius: Was denn für eine Fehlermeldung? Und bitte komplett samt Traceback (falls es den gibt) 1:1 kopieren.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
joernius
User
Beiträge: 31
Registriert: Donnerstag 11. Juni 2020, 13:47
Wohnort: Dresden
Kontaktdaten:

$ python3 classify_image.py --model tflite.tpu_model/model_edgetpu.tflite --labels tflite.tpu_model/labels.txt --input sperling.jpg
Traceback (most recent call last):
File "/home/pi/tflite1/tflite1-env/lib/python3.7/site-packages/tflite_runtime/interpreter.py", line 152, in load_delegate
delegate = Delegate(library, options)
File "/home/pi/tflite1/tflite1-env/lib/python3.7/site-packages/tflite_runtime/interpreter.py", line 111, in __init__
raise ValueError(capture.message)
ValueError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "classify_image.py", line 119, in <module>
main()
File "classify_image.py", line 96, in main
interpreter = make_interpreter(args.model)
File "classify_image.py", line 70, in make_interpreter
{'device': device[0]} if device else {})
File "/home/pi/tflite1/tflite1-env/lib/python3.7/site-packages/tflite_runtime/interpreter.py", line 155, in load_delegate
library, str(e)))
ValueError: Failed to load delegate from libedgetpu.so.1
Benutzeravatar
joernius
User
Beiträge: 31
Registriert: Donnerstag 11. Juni 2020, 13:47
Wohnort: Dresden
Kontaktdaten:

Sirius3 hat geschrieben: Montag 11. Januar 2021, 18:52
@joernius: Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4 und mal 2.
Und wo ist das Problem?
Ja, ich weiß um die Bedeutung der Einrückung bei Python, aber das Skript habe ich so geklaut. Ich kann eben nur Bash :x den Rest "borge"ich mir aus...
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@joernius: Na dann kann man doch einfach den `ValueError` entsprechend behandeln. Stichwort ist Ausnahmebehandlung.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
joernius
User
Beiträge: 31
Registriert: Donnerstag 11. Juni 2020, 13:47
Wohnort: Dresden
Kontaktdaten:

__blackjack__ hat geschrieben: Dienstag 12. Januar 2021, 00:23 @joernius: Na dann kann man doch einfach den `ValueError` entsprechend behandeln. Stichwort ist Ausnahmebehandlung.
OK, danke. Werde mich mal schlau-googlen.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Nicht schlau-Googlen, sondern den entsprechenden Abschnitt in der Dokumentation durcharbeiten: https://docs.python.org/3/tutorial/errors.html
Benutzeravatar
joernius
User
Beiträge: 31
Registriert: Donnerstag 11. Juni 2020, 13:47
Wohnort: Dresden
Kontaktdaten:

Danke für die Schubser :D ,

die Tutorial lesen sich schön einfach, aber meine Praxis sieht dann so aus:

Code: Alles auswählen

ef make_interpreter(model_file):
  model_file, *device = model_file.split('@')
  return tflite.Interpreter(
      model_path=model_file,
      experimental_delegates=[
          tflite.load_delegate(EDGETPU_SHARED_LIB,
                               {'device': device[0]} if device else {})
      except ValueError:
      print("Coral Acculator nicht angesteckt, bitte Auffruf ändern") 
      ])
Meine einzige Freude bei Einsatz dieses einfügten Aufrufes war, das die Schlüsselwörter schön bunt im VIM dargestellt werden.
Egal wo ich den Zweizeiler hinsteckte, mehr eingerückt, nach der Klammer usw.... Python ist da einer festen Meinung:

Code: Alles auswählen

    except ValueError:
         ^
SyntaxError: invalid syntax
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Zu einem except gehört auch ein try.
Antworten