Ermitteln, ob .pptx bereits geöffnet ist

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
Saimn
User
Beiträge: 3
Registriert: Sonntag 27. März 2022, 11:42

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Saimn
User
Beiträge: 3
Registriert: Sonntag 27. März 2022, 11:42

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

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.
Saimn
User
Beiträge: 3
Registriert: Sonntag 27. März 2022, 11:42

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.
Benutzeravatar
Kebap
User
Beiträge: 776
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Antworten