os.system() durch subprocess.Popen() ersetzen

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
twessels
User
Beiträge: 22
Registriert: Freitag 21. Januar 2011, 13:05

Hi,
ich verwende os.system() um ein PDF aus meinem Programm aufzurufen.
Das ganze sieht so aus:

Code: Alles auswählen

	def showManual(self):
		try:
			os.system("..\doc\Manual.pdf")
		except OSError, e:
			self.statusBar().showMessage("Couldn't open Manual.pdf", 5000)
Der große Vorteil hier ist, ich brauche auf dem System nicht nach einem PDF-Betrachter zu suchen. Subprocess will den ja haben als erstes Argument. Nachteil: Meine GUI hängt, solange das Manual geöffnet ist.

Irgendwelche Ideen? :wink:

Gruß
BlackJack

@twessels: Datendateien ”starten” ist abhängig vom Betriebssystem. Damit es unabhängig wird, würde ich das desktop-Modul vorschlagen.
LivingOn
User
Beiträge: 33
Registriert: Montag 11. August 2008, 07:53

grundsätzlich ist BlackJacks Vorschlag vorzuziehen, aber als Quick & Dirty-Lösung und da Du ja anscheinend Windows benutzt, versuche mal folgendes:

os.system("start ..\doc\Manual.pdf")
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Wenn wirklich nur Windows im Blick ist, dann eher `os.startfile`: http://docs.python.org/library/os.html#os.startfile
twessels
User
Beiträge: 22
Registriert: Freitag 21. Januar 2011, 13:05

cofi hat geschrieben:Wenn wirklich nur Windows im Blick ist, dann eher `os.startfile`: http://docs.python.org/library/os.html#os.startfile
Danke funktioniert! Das desktop modul gucke ich mir auch mal an
lunar

@twessels: Falls es sich – wie ich angesichts der Methodennamen vermute – um eine Qt-Anwendung handelt, kannst Du auch "QtGui.QDesktopServices.openUrl()" verwenden.

Selbst wenn dem nicht so ist, benötigt man keine zusätzliche Abhängigkeit:

Code: Alles auswählen

def open_file(filename):
    filename = os.path.normpath(filename)
    if hasattr(os, 'startfile'):
        os.startfile(os.path.normpath(filename))
    else:
        executable = 'open' if os.name == 'mac' else 'xdg-open'
        subprocess.Popen([executable, filename])
Vom "desktop"-Modul rate ich ab. Dass der Link auf der PyPI-Seite ins Nichts führt und das Projekt auf der Website insgesamt gar nicht mehr erwähnt wird, lässt vermuten, dass es nicht mehr gewartet wird. Bestenfalls tut es eh nur dasselbe wie obige Funktion.
Antworten