Seite 1 von 1

Ermitteln, ob .pptx bereits geöffnet ist

Verfasst: Sonntag 27. März 2022, 12:15
von Saimn
Hallo Python-Community,

ich habe ein Tool mit GUI erstellt und öffne per Button eine PowerPoint-Datei.
Nun möchte ich einfach ein PopUp öffnen, wenn die Datei bereits geöffnet ist. Klingt total simpel, ist es hoffentlich auch, aber irgendwie stehe ich auf dem Schlauch.

import subprocess
filepath = r'D:\test.pptx'
if subprocess.Popen(filepath, shell=True).poll() is None:
print('Popup öffnen')

In diesem Fall würde das PopUp immer erscheinen, da die if-Abfrage die Datei öffnet. Also auch bei der ersten Betätigung des Buttons. Dies könnte ich mit einer Bool-Variablen abfangen. Es könnte aber auch sein, dass die Datei über den Explorer geöffnet wurde. Und in diesem Fall soll das PopUp auch bei der ersten Buttonbetätigung erscheinen.
Das brachte mich auf Versuche über einen Prozess und ich bin auf wmi gestoßen.

import wmi
c = wmi.WMI()
for process in c.Win32_Process():
if process.Name == 'POWERPNT.EXE':
print(process)

Damit kann ich abfragen, ob PowerPoint läuft. Mir fehlt aber der 2te Schritt: welche Datei ist in Verwendung? Außerdem ist die Laufzeit recht hoch, da eben alle laufenden Prozesse durchsucht werden.

Eine Möglichkeit, die erstmal funktioniert, ist die Abfrage der temporären Datei:

from pathlib import Path
if Path(r'D:\~$test.pptx').is_file():
print('Popup öffnen')

Allerdings ist mir beim Durchstöbern von Verzeichnissen auf Servern schon oft aufgefallen, dass solche temporären Datein existieren, obwohl sie gar nicht geöffnet sind.
Das PopUp würde also fälschlicherweise geöffnet.

Wäre super, wenn mir da irgendjemand eine Lösung schildern kann. Etliche Google-Suchen bringen mich immer nur zu Themen mit f.open etc. Vielleicht fehlt mir auch einfach das richtige Schlüsselwort für eine erfolgreiche Suche. Irgendwie kann ich mir nicht vorstellen, dass ich mit dieser scheinbar einfachen Aufgabe der Erste bin ;)
Danke vorab.

Re: Ermitteln, ob .pptx bereits geöffnet ist

Verfasst: Sonntag 27. März 2022, 15:09
von __deets__
Ich denke https://stackoverflow.com/questions/133 ... -is-locked sollte helfen. Wobei es nach meinem Wissen grundsaetzliche Probleme mit solchen Berechtigungen und Zustaenden von Dateien gibt, wenn man mit Fileservern arbeitet. Einer der Gruende, warum man das heutzutage nach Moeglichkeit vermeidet, und lieber mit HTTP-Tools arbeitet.

Re: Ermitteln, ob .pptx bereits geöffnet ist

Verfasst: Sonntag 27. März 2022, 19:12
von Saimn
Danke für die Antwort. Irgendwie bisschen von hinten durch die Brust ins Auge, aber wenigstens kann ich mir da was basteln was den Zweck erfüllt. Hätte gedacht, dass es da eine stilvollere Lösung gibt, aber scheinbar nicht wenn das andere Foren auch so schildern.

Re: Ermitteln, ob .pptx bereits geöffnet ist

Verfasst: Sonntag 27. März 2022, 19:26
von Sirius3
Sich irgendwas über das Filesystem zu basteln, ist kein sicherer Weg um herauszufinden, ob etwas in Powerpoint geladen ist. Dafür gibt es die DCOM-Schnittstelle, damit kannst du sowohl Dateien öffnen und schließen, als auch herauszufinden, was gerade geöffnet ist.

Re: Ermitteln, ob .pptx bereits geöffnet ist

Verfasst: Montag 28. März 2022, 13:06
von Saimn
Sirius3 hat geschrieben: Sonntag 27. März 2022, 19:26 Sich irgendwas über das Filesystem zu basteln, ist kein sicherer Weg um herauszufinden, ob etwas in Powerpoint geladen ist. Dafür gibt es die DCOM-Schnittstelle, damit kannst du sowohl Dateien öffnen und schließen, als auch herauszufinden, was gerade geöffnet ist.
Vielleicht ist das ja die stilvollere Lösung nach der ich suche. Aber könntest du das bitte mal genauer erläutern?!
Meinst du damit die Verwendung von win32com?
Wie ich damit eine Applikation starte, Datei öffne / schließe und die Anwendung beende weiß ich.

Bsp.:
import win32com
from win32com import client
powerpoint = win32com.client.Dispatch('PowerPoint.Application')
powerpoint.Presentations.Open('Dateipfad')
powerpoint.Presentations(powerpointfile).Close()
powerpoint.Quit()

Aber wie ich rausbekomme, ob eine Datei bereits in Verwendung ist, vor allem wenn sie evtl. von einem anderen Nutzer in Verwendung ist oder eben nicht über Python gestartet wurde weiß ich nicht.

Re: Ermitteln, ob .pptx bereits geöffnet ist

Verfasst: Montag 28. März 2022, 13:37
von Kebap
Da musst du wohl mal ein bisschen in der COM Dokumentation von Powerpoint blättern.
Das "Presentations" Objekt ist ja schon ziemlich nah an dem, was du wissen willst.
Darüber kannst du dir eine Liste der geöffneten "Presentation" Objekte (ohne S) geben.
Das sind natürlich nur die Präsentationen, die der aktuelle Benutzer bei sich geöffnet hat.

Woran würde der aktuelle Nutzer merken, dass irgendwo irgendjemand anders eine Datei geöffnet hat?
Vermutlich liegen die Dateien irgendwo zentral im Netzwerk herum? Dann hilft Presentations.CanCheckOut:
https://docs.microsoft.com/de-de/office ... ancheckout