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

Mittwoch 13. Juli 2011, 08:59

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

Mittwoch 13. Juli 2011, 09:20

@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

Mittwoch 13. Juli 2011, 11:00

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
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mittwoch 13. Juli 2011, 11:57

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

Mittwoch 13. Juli 2011, 12:30

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

Mittwoch 13. Juli 2011, 17:42

@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