.bat Dateinen in Python ausführen geht nicht

Code-Stücke können hier veröffentlicht werden.
Antworten
Bengele
User
Beiträge: 5
Registriert: Mittwoch 11. Januar 2023, 15:14

Ich bin auf der Suche nach einer Möglichkeit ein .bat Datei in Python aufzurufen und den Inhalt der .bat Datei laufen zu lassen.
Die .bat Datei alleine läuft ohne Probleme. Sie ruft eine Hex Datei auf und programmiert (jLink von Segger) einen Baustein EFR32.
Auch der Aufruf unter Python geht zwar, aber er findet die .hex Datei nicht mehr die in der .bat Datei aufgerufen wird.

Hier der Ausschnitt des Python Programm mit dem Aufruf der .bat Datei.

# Ausführung der Programmierung Firmware in einer .bat Datei
subprocess.call([r'D:\flash_test.bat'])

Aufbau der .bat Datei die aufgerufen wird. Der Commander ruft die Test-file.hex Datei auf in der der Code für den EFR32 ist. Der "!errorlevel!" soll anzeigen ob die Programmierung Fail/Pass ist und gibt einen Pass Wert von Null an; ansonsten bei Fail eine - Zahl:

@ECHO OFF

setlocal enabledelayedexpansion
commander flash test-file.hex -d EFR32BG22

echo !errorlevel!

IF !errorlevel! NEQ 0 (
goto ExitBatchError
)

:ExitBatchError
IF !errorlevel! NEQ 0 (
echo flash error
EXIT /B
) ELSE (
echo flash ok
)


Hinweis: Ich bin blutiger Anfänger und versuche mich durch viel Probleme durch zu kämpfen. Daher geht von einem Dummy aus. :D
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das liegt am falschen Arbeitsverzeichnis. Du kannst subprocess.call das Argument "cwd" angeben, und das sollte auf das Verzeichnis zeigen, in dem test-file.hex liegt. Und am besten auch gleich subprocess.run verwenden, call ist veraltet.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bengele: Ist die `*.bat`-Datei denn notwendig? Da steht ja kaum was drin und nichts was man nicht auch in Python machen kann.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import subprocess


def main():
    try:
        subprocess.run(
            ["commander", "flash", "test-file.hex", "-d", "EFR32BG22"],
            cwd="D:/",
            check=True,
        )
    except subprocess.CalledProcessError:
        print("flash error")
    else:
        print("flash ok")


if __name__ == "__main__":
    main()
Alternativ zum `cwd`-Argument kann man hier natürlich auch den absoluten Pfad für die HEX-Datei angeben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Bengele
User
Beiträge: 5
Registriert: Mittwoch 11. Januar 2023, 15:14

Danke für die schnell Antwort.
Es muss nicht in einer .bat Datei sein. Es kann auch in Python eingebunden werden.
So wie du es mir geschrieben hast.
Ich werde versuchen deinen Code in mein Python Programm ein zu binden.
Kurze Einleitung zu meinem Projekt:
Ich muss auf dem IC einige Eingänge und Ausgänge über die Register direkt ansteuern und testen ob auf der Platine alle Bauteile vernünftig angelötet sind und die Signale auch wieder an den IC Pins ankommen. Wenn dies OK ist soll das IC mit einer Firmware programmiert werden. Nach der Programmierung soll noch der Ruhestrom gemessen werden.
Das wäre meine Aufgabe dies zu lösen.
Leider bin ich in Python ein Anfänger. Mein IDE ist PyCharm.
Für weitere Hilfe wäre ich dank bar.
Bengele
User
Beiträge: 5
Registriert: Mittwoch 11. Januar 2023, 15:14

Hallo __blackjack__
noch mal danke für die Hilfe.
Ein keiner schönheitsfehler habe ich noch.
Das Laufwerk G: ist ein gemepptes Laufwerk das er so nicht findet. Ab dem \123 wird von PyCarm in rot angezeigt und dein Programm läuft in eine Kette von fehlern.
Lokales Laufwerk hat das Programm keine Probleme das Script ab zu arbeiten.
Muss ich da noch was beachten?

Gruß
Bengele


#!/usr/bin/env python3
import subprocess


def main():
try:
subprocess.run(
["commander", "flash", "test-file.hex", "-d", "EFR32BG22"],
cwd="G:\123\Firmware",
check=True,
)
except subprocess.CalledProcessError:
print("flash error")
else:
print("flash ok")


if __name__ == "__main__":
main()
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du benutzt backslashes als Pfadtrenner. Benutz stattdessen /.
Antworten