Mit subprocess gleiche Instanz ausführen

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
Benutzeravatar
Empi
User
Beiträge: 26
Registriert: Montag 29. März 2010, 14:05

Hallo zusammen.

Vorweg: Ich öffne eine Textdatei mit z.B. Notepad++. Wenn ich jetzt eine weitere txt Datei öffne, dann wird keine weitere Instanz von Notepad++ geöffnet sondern die bereits geöffnete Instanz
öffnet einen weiteren Tab in Notepad++.
Mein Programm wird vor diese Aktion geschaltet. Wenn man also z.B. eine Txt Datei öffnet, wird mein Python Programm gestartet, das führt ein paar Operationen durch und führt mittels subprocess
(nebenei: Gutes Tutorial unter http://jimmyg.org/blog/2009/working-wit ... ocess.html)
Notepad++ aus (übergibt Notepad++ den Dateiparameter aus sys.argv)

Code: Alles auswählen

pOpen = subprocess.Popen([fullPath, progPara])
pOpen.wait() 
retcode = pOpen.returncode
Das Problem ist hierbei, daß jedes mal eine neue Instanz von Notepad++ erzeugt wird (was ohne mein
vorgeschaltet Programm nicht der Fall wäre).
Ich kenne zwar eine WinAPI, mit ich testen kann, ob mein Programm bereits einmal geöffnet wurde und könnte entsprechend reagieren, aber das bringt mich nicht meinem Problem auch nicht weiter. :K
BlackJack

@Empi: Schau doch mal mit welchen Argumenten Notepad++ ausgeführt wird, wenn Du eine Textdatei öffnest. Wahrscheinlich gibt es da eine Option die angibt, dass kein neues Exemplar gestartet werden soll, sondern ein neuer Tab aufgemacht werden soll.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich hab mal Google benutzt. :o

http://sourceforge.net/apps/mediawiki/n ... e_Switches

Ohne dieses Programm installiert zu haben, würde ich trotzdem mal vermuten, dass dieses `-multiInst` irgendwie aktiviert wurde. Lustigerweise scheint es dort keine Option für `-singleInst` zu geben. Vielleicht einfach mal auf gut Glück probieren?

Ich denke aber, deine Frage lässt sich eher auf der Mailinglist von Notepad++ klären als hier im Forum. Das einzig pythonspezifische daran ist ja nur der Aufruf mit `subprocess`.
Benutzeravatar
Empi
User
Beiträge: 26
Registriert: Montag 29. März 2010, 14:05

Nehmt das mit Notepad++ nicht zu wörtlich. Es ist nur ein Beispiel - in Wirklichkeit handelt es sich hierbei um ein Programm aus der CAD.
Habe die Parallele nur zu Notepad++ gezogen, weil es hier einfacher zu erklären ist.
Vor langer langer langer Zeit habe ich selbst mal an einer Entwicklungs- GUI programmiert (noch unter VB).
Dort stellte sich selbiges Problem (mit den Instanzen).
Dafür gab es eine Windows API, die das managte.
Mein Problem ist aber nicht, daß mein Programm mehrfach aufgerufen wird, sondern daß subprocess, wenn es das andere Programm
"mehrfach" starten soll, eben dieses Programm immer in einer neuen Instanz aufruft.
BlackJack

@Empi: Es läuft aber letztendlich auf das gleiche hinaus: Du musst den Unterschied zwischen Deinem Aufruf und dem "anderen" herausfinden und Deinen Aufruf entsprechend anpassen.

Wie sieht denn der "andere" Aufruf aus? Doppelklick auf ein Dokument, dessen Typ mit der Anwendung verknüpft ist? Mit welchen Argumenten wird die Anwendung dann aufgerufen und mit welchen Optionen? Das ist ja irgendwo in der Registry hinterlegt.
Benutzeravatar
Empi
User
Beiträge: 26
Registriert: Montag 29. März 2010, 14:05

BlackJack hat geschrieben:@Empi: Es läuft aber letztendlich auf das gleiche hinaus: Du musst den Unterschied zwischen Deinem Aufruf und dem "anderen" herausfinden und Deinen Aufruf entsprechend anpassen.

Wie sieht denn der "andere" Aufruf aus? Doppelklick auf ein Dokument, dessen Typ mit der Anwendung verknüpft ist?.
Exakt.
BlackJack hat geschrieben: Mit welchen Argumenten wird die Anwendung dann aufgerufen und mit welchen Optionen? Das ist ja irgendwo in der Registry hinterlegt
Der Anwendung wird einfach der Pfad zu einer Datei übergeben. Daß der Starttyp in der Registry hinterlegt wird, glaube ich nicht.
Ohne mein Programm funktioniert ja alles :mrgreen:
Ich vermute eher das der subprocess Aufruf das ganze zum "krachen" bringt.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Wenn es um CAD geht (ich kenne das Programm nicht), dann solltest du mal schaun ob das Programm eine API hat, für AutoCAD (das Selbe?), habe ich das hier gefunden: http://pyacad.sourceforge.net/

Es gibt auch noch Pywin32: http://pypi.python.org/pypi/pywin32/
the more they change the more they stay the same
Benutzeravatar
Empi
User
Beiträge: 26
Registriert: Montag 29. März 2010, 14:05

Dav1d hat geschrieben:Wenn es um CAD geht (ich kenne das Programm nicht), dann solltest du mal schaun ob das Programm eine API hat, für AutoCAD (das Selbe?), habe ich das hier gefunden: http://pyacad.sourceforge.net/

Es gibt auch noch Pywin32: http://pypi.python.org/pypi/pywin32/
CAD ist die Abkürzung für "Computer aided design".
Eine Programmapi in dem Sinne, daß ich das Programm direkt steuern kann existiert nicht, kann es einfach nur aufrufen und ein Pfad übergeben.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.
Empi hat geschrieben:Der Anwendung wird einfach der Pfad zu einer Datei übergeben. Daß der Starttyp in der Registry hinterlegt wird, glaube ich nicht.
Dann solltest du zunächst deinen Glauben in Wissen umwandeln.
Zuletzt geändert von EyDu am Freitag 13. August 2010, 09:53, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Empi hat geschrieben:Der Anwendung wird einfach der Pfad zu einer Datei übergeben. Daß der Starttyp in der Registry hinterlegt wird, glaube ich nicht.
Ohne Registry-Eintrag wuesste Windows doch wohl nicht, welches Programm beim Doppelcklick gestartet werden soll... "Glauben" bringt dich hier eh nicht weiter, schau doch einfach mal nach!
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hilft dir os.startfile() vielleicht? An sich würde es aber wohl mehr Sinn machen, wenn du einfach mal den Code, den du bisher hast, zeigst. Was solche abstrakten Erklärungsversuche mit Beispielen, die dann am Ende doch nicht passen, bringen, hast du ja gesehen. ;)
fhoech
User
Beiträge: 143
Registriert: Montag 9. April 2007, 18:26

Unter Windows läuft das Öffnen von Dateien in bereits gestarteten Programmen afaik über DDE-Nachrichten (DDE = Dynamic Data Exchange) oder COM/OLE. Das gewünschte Verhalten lässt sich zwar über subprocess erreichen:

Code: Alles auswählen

import subprocess
subprocess.call('start MeineDatei', shell=True)
Aber es wurde ja bereits os.startfile genannt, was den besseren Weg darstellt.
Benutzeravatar
Empi
User
Beiträge: 26
Registriert: Montag 29. März 2010, 14:05

Sodele: os.startfile war der richtige Weg in die richtige Richtung.
Der Befehl selbst funktioniert zwar auf meinem Client nicht (Programm wird einfach nicht gestartet und liefert aber auch keine Fehlermeldung :K), aber jemand anders hatte einen ähnlichen Fehler:
http://bytes.com/topic/python/answers/7 ... -extension
Werde das jetzt mal implementieren und hoffen daß es funktioniert.

Danke euch allen für eure Mühen.
Antworten