Seite 1 von 1

externes Programm aufrufen

Verfasst: Mittwoch 20. September 2023, 23:42
von Alter Mann
Hallo Forum,
wundert euch nicht über die Zeit ==> senile Bettflucht

Es gelingt mir nicht mit diesem Code das externe Programm KF.py aufzurufen. Die messagebox erscheint noch aber wenn ich dann auf ok klicke ist Feierabend. Keine Fehlermeldung, kein print nd kein externes Programm

# Funktion, die aufgerufen wird, wenn ein Element per Doppelklick ausgewählt wird

Code: Alles auswählen

def open_program():
    selected_item = listbox.get(listbox.curselection())  # Das ausgewählte Element in der Listbox abrufen
    messagebox.showinfo("Auswahl", f"Sie haben '{selected_item}' ausgewählt.")  # MessageBox anzeigen

    try:
        # Das externe Programm öffnen und Ausgabe erfassen
        process = subprocess.Popen([program_path], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        # subprocess.run(["python", "KF.py"])  # den Namen der anderen Datei verwenden
        stdout, stderr = process.communicate() #Debugging
        if stdout:
            print("Standardausgabe:", stdout.decode())
        if stderr:
            print("Fehlerausgabe:", stderr.decode())
    except FileNotFoundError:
        messagebox.showerror("Fehler", "Das Programm 'KF.py' wurde nicht gefunden.")

# Doppelklick-Ereignis zur Listbox hinzufügen, um die Funktion open_program aufzurufen
listbox.bind("<Double-Button-1>", lambda event=None: open_program())

# Hier den absoluten Pfad zum Programm "Pat.py" angeben
program_path = r"C:\Users\manfr\PycharmProjects\pythonProject1\KF.py"  # Beispiel-Pfad
Was mache ich falsch?

Vielen Dank im Voraus

Mit freundliche Grüßen

Manfred

Re: externes Programm aufrufen

Verfasst: Donnerstag 21. September 2023, 07:10
von peterpy
Hallo Manfred,

so wie ich das verstehe, ist dein externes Programm KF ein Python Script, also ein Modul.
Dieses Modul solltest Du importieren. Dann kannst Du auf die Funktionen in KF zugreifen.
In deinem Hauptmodul imortierst Du ja auch tkinter.
Ebenso sollst Du KF importieren,

Code: Alles auswählen

import KF as kf
Dann kannst Du auf die Funktionen und Klassen in KF zugreifen.

Code: Alles auswählen

antwort_von_funktion in_kf = kf.funktion_in_kf(arg1, arg2, ...)
Modulnamen sollten klein geschrieben werden, nur kf
Dann reicht ein simples

Code: Alles auswählen

import kf
.

Gruss und alles Gute
Peter

Re: externes Programm aufrufen

Verfasst: Donnerstag 21. September 2023, 07:18
von Sirius3
Da ist so einiges falsch:
alles was eine Funktion braucht, muß sie über ihre Argumente bekommen. Es darf keine globalen Variablen geben.
Bei GUIs darf es keine Lang-Laufenden Funktionen geben, Dein subprocess-Aufruf blockiert aber die ganze GUI.
Niemals shell=True benutzen.
Es ist Unsinn, lambda zu benutzen, wenn man doch die aufrufende Funktion selbst in der Hand hat.

In Python kann man Module importieren, ein Pythonprogramm aus Python heraus aufzurufen ist also fast nie nötig. Es ist meist besser, die Funktionalität einfach in das Programm einzubinden. Vor allem, wenn es sich um eine GUI handelt und man irgendwie die Kommunikation zwischen anderem Programm und eigenem Programm hinbekommen möchte.

Re: externes Programm aufrufen

Verfasst: Donnerstag 21. September 2023, 08:32
von __blackjack__
Randbemerkung: Die Kombination `Popen` und `communicate()` bietet hier keinen Vorteil über `subprocess.run()` mit den entsprechenden Argumenten.

Das `decode()` geht stillschweigend davon aus, dass die Daten UTF-8 kodiert sind. Halte ich für ein bisschen gefährlich.

Re: externes Programm aufrufen

Verfasst: Donnerstag 21. September 2023, 20:23
von Alter Mann
Danke an alle. Ich werde versuchen die Hinweise und Tipps umzusetzen. Bin halt Anfänger. Bis nach meinem Urlaub.

Viele Grüße an alle

Manfred