externes Programm aufrufen

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.
Antworten
Alter Mann
User
Beiträge: 8
Registriert: Donnerstag 14. September 2023, 18:33

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
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

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
Sirius3
User
Beiträge: 17779
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13163
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Alter Mann
User
Beiträge: 8
Registriert: Donnerstag 14. September 2023, 18:33

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
Antworten