Command Line Tool

aliced25

0x7F6990 & 0xFFEF
Ein Hallo an die MacUser, ich habe unter Windows eine kleine Batch Datei erstellt, um den Update Prozess meines Sequencers zu vereinfachen. Dieses Tool würde ich auch gerne den MacUsern zur Verfügung stellen, leider kenne ich mich mit dem MacOS nicht so gut aus und habe auch noch keinen hier, um eigene Versuche zu verifizieren.

das Tool soll lediglich die verfügbaren COM Ports auflisten, einen Auswahldialog anbieten und das Ergebnis in eine Befehlszeile einsetzen. Zum Vergleich ist folgend der entsprechende Windows Code einsehbar.

Code:
@echo off
echo.
echo available COM ports:
echo.
wmic path win32_pnpentity get caption /format:table| find "COM"
echo.
SET /P portNr="enter COM port number: "
echo.
SET COMport=COM%portNr%
echo using %COMport% ...
echo.
esptool.py --chip esp32 --port %COMport% --baud 460800 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 bootloader_dio_40m.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 firmware.bin
pause
 
Kanns grade nicht ausprobieren, aber ausm Kopf ungefär so:

Bash:
#!/bin/bash
echo "Available ports:"
ports=( $(ls /dev/tty.usbserial-*) )
for (( i=0; i<${#ports[@]}; i+=1 )); do
    echo "$(($num + 1)) - ${ports[$num]}"
done
read -p "Enter port number: " sel
port=${ports[$(($sel - 1))]}
if [ -n "$port" ]; then
    echo "$port"
fi

statt dem letzten echo dann halt den esptool.py aufruf, der sollte unter Mac glaube ich bis auf den Port genauso aussehen.
Das $num+1 und $sel-1 ist nur damit die Nummerierung bei 1 beginnt statt 0 wie der Index des Array.
 
Zuletzt bearbeitet:
Ok, der Code oben macht genau das was gewünscht war, Danke...

Leider gibt es wohl seit Monterey einige Probleme Python aus dem Terminal anzusprechen. Meine Recherche das zu fixen war bisher vergeblich und meine Verständnis ist auch noch unzureichend, um den Fehler zu lokalisieren. Als Fehlermeldung erhalte ich immer ein "Command not found"
Python3 ist aber installiert und auf anderer Ebene kann ich das esptool auch ausführen....
 
In der PATH-Variablen ist der Pfad zum Python Binary aber eingetragen?
Wäre natürlich bei Linux und Derivaten ein Klassiker; aber mehr kann ich leider nicht beitragen.
 
Ok, der Code oben macht genau das was gewünscht war, Danke...

Leider gibt es wohl seit Monterey einige Probleme Python aus dem Terminal anzusprechen. Meine Recherche das zu fixen war bisher vergeblich und meine Verständnis ist auch noch unzureichend, um den Fehler zu lokalisieren. Als Fehlermeldung erhalte ich immer ein "Command not found"
Python3 ist aber installiert und auf anderer Ebene kann ich das esptool auch ausführen....
Wenn du mir erzählst wie du Python installiert hast, kann ich das versuchen nachzustellen und dir ggf. eine Lösung verraten...

Bei mir liegt python3 unter /usr/local/bin, welches auch im pfad liegt...
Bash:
$ which python3
/usr/local/bin/python3
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Apple/usr/bin
 
Zuletzt bearbeitet:
@aliced25
Dann wäre es hilfreich einmal genauer zu erläutern was dein Code tut (oder gleich Teile des Codes zu posten) und zu beschreiben wann es funktioniert und wann nicht.
Ich kann leider mit der Aussage "auf einer anderen Ebene funktioniert es" derzeit nicht viel anfangen.

Wenn python auf dem gleichen Rechner einmal gefunden wird und in einer anderen Konstellation oder von einem anderen Script nicht, dann wird es mit ziemlicher Sicherheit, wie schon von @j[b++] geschrieben, an der Umgebungsvariable PATH liegen.
Das kann man auf zwei Arten fixen: PATH erweitern oder python mit absolutem Pfad aufrufen.

Wenn das Script auf diversen verschiedenen Systemen funktionieren soll, so muss es prüfen ob es python findet, z.B. durch durchprobieren verschiedener bekannter Pfade oder auch suchen nach python im Dateisystem...
 
Bei mir liegt python3 unter /usr/local/bin, welches auch im pfad liegt...
Bash:
$ which python3
/usr/local/bin/python3
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Apple/usr/bin

ja, dass hatte ich auch schon so überprüft...
Code:
... ~ % which python3
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3
... ~ %

Ich kann das esptool.py auch via Doppelklick ausführen, nur halt nicht aus dem Terminal heraus mit entsprechenden Parametern starten.

…es geht ihm denke ich eher um eine allgemeingültige Lösung - also ein tool zu erstellen, welches sehr wahrscheinlich auf allen Mac-Installationen funktioniert…

genau, weißt Du ja. Ich möchte halt nur ein Script haben, mit dem jeder einfach updaten kann, ohne kryptische Parameterfolgen einzutippen. Mit dem Windows Script funktioniert das auch wunderbar.

Code:
#!/bin/bash
echo "Available ports:"
ports=( $(ls /dev/tty.usbserial-*) )
for (( i=0; i<${#ports[@]}; i+=1 )); do
    echo "$(($num + 1)) - ${ports[$num]}"
done
read -p "Enter port number: " sel
port=${ports[$(($sel - 1))]}
if [ -n "$port" ]; then
    echo "$port"
esptool.py --chip esp32 --port %ports% --baud 460800 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 bootloader_dio_40m.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 firmware.bin
fi

evtl. kannst Du das Script bei Dir überprüfen, wenn Du es in dem Update Ordner anlegst...
 
@aliced25
Dann wäre es hilfreich einmal genauer zu erläutern was dein Code tut (oder gleich Teile des Codes zu posten) und zu beschreiben wann es funktioniert und wann nicht.
Ich kann leider mit der Aussage "auf einer anderen Ebene funktioniert es" derzeit nicht viel anfangen.

Also das Tool soll den Update Prozess eines ESP32 vereinfachen, dabei muss nur herausgefunden werden, an welchem COM Port der ESP32 angeschlossen ist. Danach soll das esptool.py mit den entsprechenden Parametern ausgeführt werden.
Für mich selber ist das eher nicht relevant, da ich direkt aus Visual Code heraus, dass Update mit dem esptool.py starte, was auch problemlos funktioniert. Via Doppelklick kann ich das esptool.py im Finder auch starten, aber z.B. nicht aus dem Terminal, da sagt er "Command not found".
 
Ok, hier mal das Script mit zwei kleinen Verbesserungen:

1) Fehler abfangen, wenn gar kein USB Serial gefunden wird
2) Testen ob python gefunden wird

Bash:
#!/bin/bash
echo "Available ports:"
ports=( $(ls /dev/tty.usbserial-* 2>/dev/null) )
if [ ${#ports[@]} -ne 0 ]; then
    for (( i=0; i<${#ports[@]}; i+=1 )); do
        echo "$(($num + 1)) - ${ports[$num]}"
    done
    read -p "Enter port number: " sel
    port=${ports[$(($sel - 1))]}
    if [ -n "$port" ]; then
        echo "$port"
        PYTHON=$(which python3)
        if [ -n "$PYTHON" ]; then
            $PYTHON esptool.py --chip esp32 --port %ports% --baud 460800 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 40m --flash_size detect 0x1000 bootloader_dio_40m.bin 0x8000 partitions.bin 0xe000 boot_app0.bin 0x10000 firmware.bin
        else
            echo "No python3 found on this system!"
        fi
    fi
else
    echo "No USB Serial found!"
fi

PS: Code nochmal verändert, weil er fehlerhaft war...
 
Zuletzt bearbeitet:
Stilfrage zwar, aber wenn du die USB-Ports-Abfrage ins Gegenteil umkehrst und erst die Fehlersituation behandelst, dann kannst du die die Einrückung im Rest sparen. Machrt den Code lesbarer (hier vielleicht egal, bei komplexerem Code aber nicht). Leuten, die Code erstellen, kann ich die Guidelines für den Linux-Kernel mal empfehlen für lesbaren Code.

Bash:
#!/bin/bash
if [ -f /dev/tty.usbserial-* ]; then
...
else
    echo "No USB Serial found!"
fi
[/QUOTE]

Bash:
if [ ! -f /dev/tty.usbserial-* ]; then
    echo "No USB Serial found!"
    exit <Fehlernummer>
fi

...
 
Stilfrage zwar, aber wenn du die USB-Ports-Abfrage ins Gegenteil umkehrst und erst die Fehlersituation behandelst, dann kannst du die die Einrückung im Rest sparen. Machrt den Code lesbarer (hier vielleicht egal, bei komplexerem Code aber nicht). Leuten, die Code erstellen, kann ich die Guidelines für den Linux-Kernel mal empfehlen für lesbaren Code.

Bash:
#!/bin/bash
if [ -f /dev/tty.usbserial-* ]; then
...
else
    echo "No USB Serial found!"
fi


Bash:
if [ ! -f /dev/tty.usbserial-* ]; then
    echo "No USB Serial found!"
    exit <Fehlernummer>
fi

...
Ja ist in der Tat reine Stilfrage, aber der Code funktioniert sowieso nicht ,) daher hab ich den nochmal geändert...
 
@aliced25
Ich sehe hier aber noch ein ganz anderes Problem, dir ist schon klar das der User der das Update machen möchte sowieso die ESP Tools installiert haben muss...
 
Bash:
Last login: Sat Apr 16 13:37:14 on ttys000
/Users/alfred/Desktop/MidiTraC_r3/test.command ; exit;
alfred@alfredsacStudio ~ % /Users/alfred/Desktop/MidiTraC_r3/test.command ; exit;
Available ports:
1 - /dev/tty.usbserial-0001
Enter port number: 1
/dev/tty.usbserial-0001
/Library/Frameworks/Python.framework/Versions/3.10/bin/python3: can't open file '/Users/alfred/esptool.py': [Errno 2] No such file or directory

Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[Prozess beendet]
 
@aliced25
Ich sehe hier aber noch ein ganz anderes Problem, dir ist schon klar das der User der das Update machen möchte sowieso die ESP Tools installiert haben muss...

Das stimmt natürlich, aber das wäre ja nur einmalig zu machen mit:

pip install esptool
pip install pyserial

wie gesagt unter Windoof klappt das auch ohne Probleme, in der Mac Welt bin ich neu...
 
Auch das ist wieder ein Pfadproblem... dein Script liegt in /Users/alfred und sucht dort esptool.py, das liegt dort aber nicht...

Ich befürchte dein Vorhaben wird nicht so einfach umzusetzen sein wie du dir das vorstellst..., denn auch esptool.py ist nicht einfach nur eine Datei mit einem Script...
(guck mal hier: https://github.com/espressif/esptool)
 
Das stimmt natürlich, aber das wäre ja nur einmalig zu machen mit:

pip install esptool
pip install pyserial

wie gesagt unter Windoof klappt das auch ohne Probleme, in der Mac Welt bin ich neu...
ok, dann muss dein Script noch rauskriegen wo esptool.py liegt...
Code:
ESPTOOL=$(find /Library/Frameworks/Python.framework -name 'esptool.py' 2>/dev/null | head -1)
$PYTHON $ESPTOOL --chip esp32 ....
 
Zuletzt bearbeitet:
oder Probier das:
Code:
$PYTHON $(dirname $PYTHON)/esptool.py --chip esp32 ....
 
Bash:
Last login: Sat Apr 16 14:04:48 on ttys000
/Users/alfred/Desktop/MidiTraC_r3/test.command ; exit;                         
alfred@alfredsacStudio ~ % /Users/alfred/Desktop/MidiTraC_r3/test.command ; exit;
Available ports:
1 - /dev/tty.usbserial-0001
Enter port number: 1
/dev/tty.usbserial-0001
Pyserial is not installed for /Library/Frameworks/Python.framework/Versions/3.10/bin/python3. Check the README for installation instructions.
Traceback (most recent call last):
  File "/Users/alfred/esptool.py", line 39, in <module>
    import serial
ModuleNotFoundError: No module named 'serial'

Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

[Prozess beendet]

Ok, das Path Problem wäre gelöst, aber dann tun sich wieder neue Probleme auf, scheint wirklich nicht so trivial zu sein.
Trotzdem vielen Dank für Deine Hilfe....
Das Wetter ist zu schön, um sich heute noch weiter damit zu ärgern!
 


News

Zurück
Oben