Seite 1 von 1

Aufruf externes Python Skrip über Schaltfläche

Verfasst: Mi 11. Feb 2026, 17:06
von rogschmi
Hallo,

ich stelle im Zusammenhang mit der Ablösung von MS Office durch LibreOffice gerade eine kleine Anwendung von mir um. Ein Teil der Anwendung habe ich in Form von externen Python Skripten umgesetzt. Diese möchte ich nun innerhalb von Calc mittels Schaltflächen starten.

Die Skripte funktionieren in der Entwicklungsumgebung und wenn ich sie direkt im Dateiexplorer aufrufe.

Wenn ich in innerhalb von Calc eine Schaltfläche verwende und darüber ein Makro starte mit dem Aufruf per Mausklick, passiert bis auf ein kurzes Aufblitzen eines schwarzen Fensters nichts.

Das Makro sieht so aus:
Sub RunPythonScript1
Dim oShell As Object
Dim scriptPath As String
scriptPath = "G:\Finanzen\Entwicklung\Bestand_ISIN_WKN_ermitteln.py" ' Pfad zum Python-Script

oShell = CreateObject("WScript.Shell")
oShell.Run "python " & scriptPath
End Sub

Hat jemand einen Tipp für mich, woran der Aufruf scheitern könnte?

Viele Grüße
rogschmi

Re: Aufruf externes Python Skrip über Schaltfläche

Verfasst: Mi 11. Feb 2026, 18:18
von karolus
Du hast innerhalb von LO eine interne Python-umgebung, die du direkt benutzen kannst, ohne Umweg über Basic & »CreateObject("WScript.Shell")« !

zeige den python-code aus »G:\Finanzen\Entwicklung\Bestand_ISIN_WKN_ermitteln.py«

Re: Aufruf externes Python Skrip über Schaltfläche

Verfasst: Do 12. Feb 2026, 09:54
von rogschmi
Ja, ich weiß, dass es eine interne Pythonumgebung in LO gibt. Da ich in Zukunft aber weitere Themen mit Python bearbeiten möchte, die nichts mit Tabellenkalkulation zu tun haben, wäre es mir lieber, einige Teile dieser Anwendung hier entsprechend auch über die Entwicklungsumgebung zu pflegen und zu betreiben. Aber ich werde mir das trotzdem mal ansehen und ausprobieren. Danke!

Code:

Code: Alles auswählen

import openpyxl
import pandas as pd
import os
import contextlib
import datetime
import tkinter as tk
from tkinter import filedialog, messagebox

# Dateinamen
excel_datei = "Test.xlsm"
isin_datei = "Bestand_ISIN_WKN.txt"
log_isin_datei = "Log_Bestand_ISIN_WKN.txt"

#isin_datei löschen, falls sie existiert
with contextlib.suppress(FileNotFoundError):
    os.remove(isin_datei)

# Excel-Datei einlesen
xls = pd.ExcelFile(excel_datei)
df = pd.read_excel(xls, sheet_name="Stammdaten")
wb = openpyxl.load_workbook(excel_datei, data_only=True)
sheet = wb["Depot"]

# Eine leere Liste für die Ergebnisse erstellen
ergebnisse = []

# Werte für Log setzen
anzahl = 0
fehler = 0

# Ausgabewerte ermitteln (Liste der ISIN mit WKN im Bestand)
with open(isin_datei, "w") as f:
    empty_count = 0  # Zähler für leere Einträge
    for row in range(6, sheet.max_row + 1):  # Beginnt bei Zeile 6
        isin = sheet.cell(row=row, column=3).value  # Spalte C (3. Spalte)
        
        if isin is not None and isin != "":
            anzahl = anzahl + 1
            wkn = df[df.iloc[:, 0] == isin].iloc[:, 1].values
            if wkn.size > 0:
                # Falls die ISIN gefunden wurde, den Wert aus Spalte B anhängen
                ergebnisse.append(f"{isin}, {wkn[0]}")
            else:
                # nur ISIN in isin_datei schreiben
                ergebnisse.append(f"{isin}, kein Wert")
                fehler = fehler + 1
                
            empty_count = 0  # Zurücksetzen des leeren Zählers
        else:
            empty_count += 1
        
    # Schleife beenden, wenn mehr als 8 hintere Leerwerte entdeckt werden
        if empty_count > 8:
            break

# Ergebnisse in isin_datei schreiben
with open(isin_datei, "w") as f:
    for ergebnis in ergebnisse:
        f.write(ergebnis + '\n')

# Logdatei schreiben
aktuelles_datum_uhrzeit = datetime.datetime.now()
with open(log_isin_datei, 'a') as log:
    log.write (f"{aktuelles_datum_uhrzeit.strftime('%d.%m.%Y %H:%M:%S')} - Anzahl ISIN_WKN: {anzahl} - Anzahl Fehler: {fehler}" +'\n')

#Abschlussmeldung
    info_text =f"ISIN und WKN gespeichert! Fehler: {fehler}"
    messagebox.showinfo("Fertig", info_text)

print(f"Die Werte wurden erfolgreich in die Datei '{isin_datei}' übertragen.")
PS: Ich habe den einfachen Klassiker "Hallo Welt" ausprobiert, das führt zum gleichen Effekt. Ich kann allerdings über die Schaltfläche und Steuerelement-Eigenschaften - Allgemein - Aktion - Dokument/Webseite öffnen eine Anwendung starten, z.B. notepad++. Offenbar funktioniert in meiner Situation das Zusammenspiel zwischen Calc und Python noch nicht. Die Umgebungsvariablen sind gesetzt, die Ordner für Python und der Ordner mit meinen Dateien sind eingetragen.

Re: Aufruf externes Python Skrip über Schaltfläche

Verfasst: Do 12. Feb 2026, 14:15
von karolus
Hallo

Der »Hallo Welt« -Kassiker existiert bereits intern!

Ansonsten:
der gezeigte Code benötigt keinen laufenden LO-prozess, nichtmal eine vorhandene LO-installation!

wenn du das trotzdem aus Lo starten möchtest, würde ich statt basic & CreateObject("WScript.Shell") mal https://docs.python.org/3/library/subpr ... subprocess probieren.

ungetestet etwa so:

Code: Alles auswählen

from subprocess import run 

def run_external(*event):
    run(["G:/Finanzen/Entwicklung/Bestand_ISIN_WKN_ermitteln.py" ])
    #ggf
    #run(['pfad/zur/python.exe', "G:/Finanzen/Entwicklung/Bestand_ISIN_WKN_ermitteln.py"])

Re: Aufruf externes Python Skrip über Schaltfläche

Verfasst: Do 12. Feb 2026, 16:20
von rogschmi
karolus hat geschrieben:
Do 12. Feb 2026, 14:15
https://docs.python.org/3/library/subpr ... subprocess probieren.

ungetestet etwa so:

Code: Alles auswählen

from subprocess import run 

def run_external(*event):
    run(["G:/Finanzen/Entwicklung/Bestand_ISIN_WKN_ermitteln.py" ])
    #ggf
    #run(['pfad/zur/python.exe', "G:/Finanzen/Entwicklung/Bestand_ISIN_WKN_ermitteln.py"])
Funktioniert spontan nicht, aber danke, ich schaue mir das in Ruhe an.